Import Data

crowdfunding<-read.csv( "forqrm.csv" ,header=1)
crowdfunding_region<-read.csv( "forqrm.csv" ,header=1)
head(crowdfunding)
library(lmtest)
Loading required package: zoo

Attaching package: 'zoo'

The following objects are masked from 'package:base':

    as.Date, as.Date.numeric
rownames(crowdfunding)<-crowdfunding$State
se<-crowdfunding[c("GiniCoeff","pAdDeg","successful_rate")]
se
#cor

Find Topics

1.Geography information

  1. Geography information:found the significally different by state/by region
  • Amount
  • successfull rate within graphy/plot

2.Factors analysis:

  1. factors:studying the relationship between Successful Rate and other factors:
  • Higher Eduction:pAdDeg;
  • Ginicoeff # average_pledged_amount_of_Grand.Total#
pie(table(crowdfunding_region$Region))

3.Total regression

successful_rate2GiniCoeff<-lm(crowdfunding$successful_rate~crowdfunding$GiniCoeff)#significant:0.00398
summary(successful_rate2GiniCoeff)

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$GiniCoeff)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.197648 -0.054730 -0.003818  0.055170  0.201729 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)   
(Intercept)             -0.5417     0.2993  -1.810  0.07655 . 
crowdfunding$GiniCoeff   2.0008     0.6613   3.026  0.00398 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08254 on 48 degrees of freedom
Multiple R-squared:  0.1602,    Adjusted R-squared:  0.1427 
F-statistic: 9.154 on 1 and 48 DF,  p-value: 0.003981
successful_rate2NPov000s<-lm(crowdfunding$successful_rate~crowdfunding$NPov000s)#0.231
summary(successful_rate2NPov000s)

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$NPov000s)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.230673 -0.041789 -0.001671  0.045678  0.193621 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)           3.541e-01  1.642e-02  21.560   <2e-16 ***
crowdfunding$NPov000s 9.537e-06  1.113e-05   0.857    0.396    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08938 on 48 degrees of freedom
Multiple R-squared:  0.01507,   Adjusted R-squared:  -0.005451 
F-statistic: 0.7343 on 1 and 48 DF,  p-value: 0.3957
summary(lm(crowdfunding$successful_rate~crowdfunding$pHigh))#bad:0.2320 

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$pHigh)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.225211 -0.041414 -0.003402  0.046713  0.203517 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)  
(Intercept)          0.7499     0.3198   2.345   0.0232 *
crowdfunding$pHigh  -0.4451     0.3677  -1.211   0.2320  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08872 on 48 degrees of freedom
Multiple R-squared:  0.02963,   Adjusted R-squared:  0.00941 
F-statistic: 1.465 on 1 and 48 DF,  p-value: 0.232
summary(lm(crowdfunding$successful_rate~crowdfunding$pBatDeg))#low:0.05511

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$pBatDeg)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.23906 -0.06503  0.01415  0.05343  0.16307 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)   
(Intercept)           0.22503    0.07128   3.157  0.00275 **
crowdfunding$pBatDeg  0.50740    0.25810   1.966  0.05511 . 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08665 on 48 degrees of freedom
Multiple R-squared:  0.07451,   Adjusted R-squared:  0.05523 
F-statistic: 3.865 on 1 and 48 DF,  p-value: 0.05511
successful_rate2pAdDeg<-lm(crowdfunding$successful_rate~crowdfunding$pAdDeg)#significant:0.00501
summary(successful_rate2pAdDeg)

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$pAdDeg)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.22412 -0.06718  0.01152  0.04708  0.15306 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          0.22570    0.04815   4.688 2.31e-05 ***
crowdfunding$pAdDeg  1.40251    0.47679   2.942  0.00501 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.0829 on 48 degrees of freedom
Multiple R-squared:  0.1527,    Adjusted R-squared:  0.1351 
F-statistic: 8.653 on 1 and 48 DF,  p-value: 0.005015
#supplement regression
summary(lm(crowdfunding$GiniCoeff~crowdfunding$pAdDeg))#significant:0.0353

Call:
lm(formula = crowdfunding$GiniCoeff ~ crowdfunding$pAdDeg)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.031714 -0.014215  0.001214  0.013231  0.037791 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         0.431222   0.009986  43.184   <2e-16 ***
crowdfunding$pAdDeg 0.214191   0.098889   2.166   0.0353 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.01719 on 48 degrees of freedom
Multiple R-squared:  0.08904,   Adjusted R-squared:  0.07006 
F-statistic: 4.691 on 1 and 48 DF,  p-value: 0.03531
summary(lm(crowdfunding$count_of_Grand.Total~crowdfunding$Pop2010))#significant:0.0353

Call:
lm(formula = crowdfunding$count_of_Grand.Total ~ crowdfunding$Pop2010)

Residuals:
    Min      1Q  Median      3Q     Max 
-696.93  -96.93   -0.61   74.90 1418.91 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)          -1.129e+02  5.125e+01  -2.203   0.0325 *  
crowdfunding$Pop2010  5.039e-05  5.569e-06   9.048 6.03e-12 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 268 on 48 degrees of freedom
Multiple R-squared:  0.6304,    Adjusted R-squared:  0.6227 
F-statistic: 81.87 on 1 and 48 DF,  p-value: 6.028e-12
#summary(lm(successful_rate2PovRate1$residuals~crowdfunding$pAdDeg))#0.0003881
#summary(lm(successful_rate2PovRate1$residuals~crowdfunding$GiniCoeff))#0.0264
summary(lm(successful_rate2GiniCoeff$residuals~crowdfunding$pAdDeg))#residuals ~ ADdeg:0.0368

Call:
lm(formula = successful_rate2GiniCoeff$residuals ~ crowdfunding$pAdDeg)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.187967 -0.048021 -0.005676  0.052160  0.167582 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)  
(Intercept)         -0.09539    0.04578  -2.083   0.0426 *
crowdfunding$pAdDeg  0.97396    0.45341   2.148   0.0368 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.07884 on 48 degrees of freedom
Multiple R-squared:  0.0877,    Adjusted R-squared:  0.06869 
F-statistic: 4.614 on 1 and 48 DF,  p-value: 0.03678
#summary(lm(successful_rate2GiniCoeff$residuals~crowdfunding$PovRate1))#residuals ~ PovRate1:0.771
#summary(lm(successful_rate2pAdDeg$residuals~crowdfunding$PovRate1))#0.004505
summary(lm(successful_rate2pAdDeg$residuals~crowdfunding$GiniCoeff))#0.0295

Call:
lm(formula = successful_rate2pAdDeg$residuals ~ crowdfunding$GiniCoeff)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.195484 -0.051186  0.004758  0.054168  0.147777 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)  
(Intercept)             -0.6411     0.2860  -2.242   0.0296 *
crowdfunding$GiniCoeff   1.4178     0.6319   2.244   0.0295 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.07887 on 48 degrees of freedom
Multiple R-squared:  0.09492,   Adjusted R-squared:  0.07606 
F-statistic: 5.034 on 1 and 48 DF,  p-value: 0.02951
#summary(lm(log(crowdfunding$average_pledged_amount_of_Grand.Total)~crowdfunding$GiniCoeff))#0.02357

Geography information

Geography information-preprocess:kmean

hc<-hclust(dist(crowdfunding),method = "ward.D", members = NULL)
NAs introduced by coercion
plclust(hc)
'plclust' is deprecated.
Use 'plot' instead.
See help("Deprecated")
rect.hclust(hc,k=2)

heatmap(as.matrix(dist(crowdfunding,method= 'euclidean')),labRow = F, labCol = F)
NAs introduced by coercion

result<-cutree(hc,k=2)
result.category<-as.data.frame(result)
colnames(result.category)<-c("MDS_Category")
result.category
pie(result)

barplot(result,col =result )

#table(result)
#summary(result)
plot(result,type = "p",col=result,xlab="State",xaxt="n",ylab="MDS_Category")

library(ggplot2)
package 'ggplot2' was built under R version 3.3.2
mds2 <- -cmdscale(dist(crowdfunding))
NAs introduced by coercion
plot(mds2, type="n", axes=FALSE, ann=FALSE)
text(mds2, labels=rownames(mds2), xpd = NA)

mds<-cmdscale(dist(crowdfunding),k=2,eig=T)
NAs introduced by coercion
x = mds$points[,1]
y = mds$points[,2]
p=ggplot(data.frame(x,y),aes(x,y))
p+geom_point(size=5 , alpha=0.8 , aes(colour=factor(result) ))

NA
#regroup-------------------------------
#crowdfunding.backup<-crowdfunding
result.category["State"]<-row.names(result.category)
#crowdfunding<-crowdfunding[c("State","successful_rate","Region","count_of_Grand.Total","GiniCoeff","pAdDeg","pHigh","pBatDeg","Pop2010")]
#crowdfunding$Pop2010<-log(crowdfunding$Pop2010)
#crowdfunding$count_of_Grand.Total<-log(crowdfunding$count_of_Grand.Total)
crowdfunding<-merge(crowdfunding,result.category,all.x=TRUE)
#row.names(crowdfunding)<-crowdfunding$State
#GiniCoeff-------
par(mfrow=c(1,2))
plot(crowdfunding$successful_rate[crowdfunding$MDS_Category==1]~crowdfunding$GiniCoeff[crowdfunding$MDS_Category==1])
points(lowess(crowdfunding$successful_rate[crowdfunding$MDS_Category==1]~crowdfunding$GiniCoeff[crowdfunding$MDS_Category==1]),type="l",col="red")
plot(crowdfunding$successful_rate[crowdfunding$MDS_Category==2]~crowdfunding$GiniCoeff[crowdfunding$MDS_Category==2])
points(lowess(crowdfunding$successful_rate[crowdfunding$MDS_Category==2]~crowdfunding$GiniCoeff[crowdfunding$MDS_Category==2]),type="l",col="red")

summary(lm(crowdfunding$successful_rate[crowdfunding$MDS_Category==1]~crowdfunding$GiniCoeff[crowdfunding$MDS_Category==1]))

Call:
lm(formula = crowdfunding$successful_rate[crowdfunding$MDS_Category == 
    1] ~ crowdfunding$GiniCoeff[crowdfunding$MDS_Category == 
    1])

Residuals:
      Min        1Q    Median        3Q       Max 
-0.198796 -0.051943 -0.002387  0.054209  0.197760 

Coefficients:
                                                       Estimate Std. Error t value Pr(>|t|)  
(Intercept)                                             -0.6421     0.3803  -1.689   0.0999 .
crowdfunding$GiniCoeff[crowdfunding$MDS_Category == 1]   2.2359     0.8487   2.634   0.0123 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08777 on 36 degrees of freedom
Multiple R-squared:  0.1616,    Adjusted R-squared:  0.1383 
F-statistic:  6.94 on 1 and 36 DF,  p-value: 0.01235
summary(lm(crowdfunding$successful_rate[crowdfunding$MDS_Category==2]~crowdfunding$GiniCoeff[crowdfunding$MDS_Category==2]))

Call:
lm(formula = crowdfunding$successful_rate[crowdfunding$MDS_Category == 
    2] ~ crowdfunding$GiniCoeff[crowdfunding$MDS_Category == 
    2])

Residuals:
      Min        1Q    Median        3Q       Max 
-0.128261 -0.041117 -0.009601  0.055870  0.085466 

Coefficients:
                                                       Estimate Std. Error t value Pr(>|t|)
(Intercept)                                             -0.8124     0.7597  -1.069    0.310
crowdfunding$GiniCoeff[crowdfunding$MDS_Category == 2]   2.5483     1.6283   1.565    0.149

Residual standard error: 0.067 on 10 degrees of freedom
Multiple R-squared:  0.1967,    Adjusted R-squared:  0.1164 
F-statistic: 2.449 on 1 and 10 DF,  p-value: 0.1486
#pAdDeg-------
plot(crowdfunding$successful_rate[crowdfunding$MDS_Category==1]~crowdfunding$pAdDeg[crowdfunding$MDS_Category==1])
points(lowess(crowdfunding$successful_rate[crowdfunding$MDS_Category==1]~crowdfunding$pAdDeg[crowdfunding$MDS_Category==1]),type="l",col="red")
plot(crowdfunding$successful_rate[crowdfunding$MDS_Category==2]~crowdfunding$pAdDeg[crowdfunding$MDS_Category==2])
points(lowess(crowdfunding$successful_rate[crowdfunding$MDS_Category==2]~crowdfunding$pAdDeg[crowdfunding$MDS_Category==2]),type="l",col="red")

summary(lm(crowdfunding$successful_rate[crowdfunding$MDS_Category==1]~crowdfunding$pAdDeg[crowdfunding$MDS_Category==1]))

Call:
lm(formula = crowdfunding$successful_rate[crowdfunding$MDS_Category == 
    1] ~ crowdfunding$pAdDeg[crowdfunding$MDS_Category == 1])

Residuals:
     Min       1Q   Median       3Q      Max 
-0.22501 -0.06782  0.01676  0.05208  0.15686 

Coefficients:
                                                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                          0.24079    0.05685   4.236 0.000151 ***
crowdfunding$pAdDeg[crowdfunding$MDS_Category == 1]  1.24109    0.57707   2.151 0.038292 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.09023 on 36 degrees of freedom
Multiple R-squared:  0.1139,    Adjusted R-squared:  0.08924 
F-statistic: 4.625 on 1 and 36 DF,  p-value: 0.03829
summary(lm(crowdfunding$successful_rate[crowdfunding$MDS_Category==2]~crowdfunding$pAdDeg[crowdfunding$MDS_Category==2]))

Call:
lm(formula = crowdfunding$successful_rate[crowdfunding$MDS_Category == 
    2] ~ crowdfunding$pAdDeg[crowdfunding$MDS_Category == 2])

Residuals:
     Min       1Q   Median       3Q      Max 
-0.09739 -0.03931  0.00642  0.04437  0.07161 

Coefficients:
                                                    Estimate Std. Error t value Pr(>|t|)  
(Intercept)                                          0.13748    0.09196   1.495   0.1658  
crowdfunding$pAdDeg[crowdfunding$MDS_Category == 2]  2.23782    0.84798   2.639   0.0248 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.05739 on 10 degrees of freedom
Multiple R-squared:  0.4105,    Adjusted R-squared:  0.3516 
F-statistic: 6.964 on 1 and 10 DF,  p-value: 0.02478

Geography Information-simpleplot

par(mfrow=c(1,2) )
#count_of_Grand.Total
plot(crowdfunding$count_of_Grand.Total,col=crowdfunding$Region, main="Count of Projects Plot",ylab="Count of Projects",xaxt="n",xlab="State")
#axis(side=1,at=c(1,2,3,4,5,6,7,8),labels=c(crowdfunding$State))
legend("topright",legend = levels(crowdfunding$Region),cex = 0.8, pch = 1,col=1:4)
#successful_rate
plot(crowdfunding$successful_rate,col=crowdfunding$Region, main="Successful Rate Plot",ylab="Successful Rate",xaxt="n",xlab="State")
#axis(side=1,at=c(1,2,3,4,5,6,7,8),labels=c(crowdfunding$State))
legend("topleft",legend = levels(crowdfunding$Region),cex = 0.8, pch = 1,col=1:4)

Geography information-boxplot

par(mfrow=c(1,3))
#Boxplot for successful_rate and count_of_Grand.Total
#count_of_Grand.Total
boxplot(crowdfunding$count_of_Grand.Total[crowdfunding$Region=="Midwest"],
        crowdfunding$count_of_Grand.Total[crowdfunding$Region=="Northeast"],
        crowdfunding$count_of_Grand.Total[crowdfunding$Region=="South"],
        crowdfunding$count_of_Grand.Total[crowdfunding$Region=="West"],
        names=levels(crowdfunding$Region),main="Count of Projects BoxPlot by Region",varwidth=TRUE)
require(moments)
Loading required package: moments
skewness(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="Midwest"])
[1] 1.547595
skewness(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="Northeast"])
[1] 2.368424
skewness(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="South"])
[1] 1.217785
skewness(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="West"])
[1] 3.007817
kurtosis(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="Midwest"])
[1] 4.72236
kurtosis(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="Northeast"])
[1] 6.812673
kurtosis(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="South"])
[1] 3.431574
kurtosis(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="West"])
[1] 10.40857
boxplot(log(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="Midwest"]),
        log(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="Northeast"]),
        log(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="South"]),
        log(crowdfunding_region$count_of_Grand.Total[crowdfunding_region$Region=="West"]),
        names=levels(crowdfunding$Region),main="Log Count of Projects BoxPlot by Region")
#successful_rate
boxplot(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"],
        crowdfunding$successful_rate[crowdfunding$Region=="Northeast"],
        crowdfunding$successful_rate[crowdfunding$Region=="South"],
        crowdfunding$successful_rate[crowdfunding$Region=="West"],
        names=levels(crowdfunding$Region),main="Successful Rate BoxPlot by Region")
skewness(crowdfunding_region$successful_rate[crowdfunding_region$Region=="Midwest"])
[1] -0.6469442
skewness(crowdfunding_region$successful_rate[crowdfunding_region$Region=="Northeast"])
[1] -0.1748926
skewness(crowdfunding_region$successful_rate[crowdfunding_region$Region=="South"])
[1] -0.3792879
skewness(crowdfunding_region$successful_rate[crowdfunding_region$Region=="West"])
[1] -0.8937484
kurtosis(crowdfunding_region$successful_rate[crowdfunding_region$Region=="Midwest"])
[1] 2.9282
kurtosis(crowdfunding_region$successful_rate[crowdfunding_region$Region=="Northeast"])
[1] 1.466362
kurtosis(crowdfunding_region$successful_rate[crowdfunding_region$Region=="South"])
[1] 2.493975
kurtosis(crowdfunding_region$successful_rate[crowdfunding_region$Region=="West"])
[1] 3.664296
par(mfrow=c(2,4))

#count_of_Grand.Total
qqnorm(crowdfunding$count_of_Grand.Total[crowdfunding$Region=="Midwest"],xlab="Midwest",xaxt="n",col="black",main="Count of Projects-Norm Q-Q Plot")
qqline(crowdfunding$count_of_Grand.Total[crowdfunding$Region=="Midwest"])
qqnorm(crowdfunding$count_of_Grand.Total[crowdfunding$Region=="Northeast"],xlab="Northeast",xaxt="n",col="red",main="Count of Projectse-Norm Q-Q Plot")
qqline(crowdfunding$count_of_Grand.Total[crowdfunding$Region=="Northeast"])
qqnorm(crowdfunding$count_of_Grand.Total[crowdfunding$Region=="South"],xlab="South",col="green",xaxt="n",main="Count of Projects-Norm Q-Q Plot")
qqline(crowdfunding$count_of_Grand.Total[crowdfunding$Region=="South"])
qqnorm(crowdfunding$count_of_Grand.Total[crowdfunding$Region=="West"],xlab="West",col="blue",xaxt="n",main="Count of Projects-Norm Q-Q Plot")
qqline(crowdfunding$count_of_Grand.Total[crowdfunding$Region=="West"])
#successful_rate
qqnorm(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"],xlab="Midwest",col="black",xaxt="n",main="Successful Rate-Norm Q-Q Plot")
qqline(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"])
qqnorm(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"],xlab="Northeast",col="red",xaxt="n",main="Successful Rate-Norm Q-Q Plot")
qqline(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"])
qqnorm(crowdfunding$successful_rate[crowdfunding$Region=="South"],xlab="South",col="green",xaxt="n",main="Successful Rate-Norm Q-Q Plot")
qqline(crowdfunding$successful_rate[crowdfunding$Region=="South"])
qqnorm(crowdfunding$successful_rate[crowdfunding$Region=="West"],xlab="West",col="blue",xaxt="n",main="Successful Rate-Norm Q-Q Plot")
qqline(crowdfunding$successful_rate[crowdfunding$Region=="West"])

kurtosis(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"])
[1] 2.9282
kurtosis(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"])      
[1] 1.466362
kurtosis(crowdfunding$successful_rate[crowdfunding$Region=="South"])      
[1] 2.493975
kurtosis(crowdfunding$successful_rate[crowdfunding$Region=="West"])      
[1] 3.664296
par(mfrow=c(1,3))
qqnorm(crowdfunding$successful_rate, main ="Successful rate:Q-Q norm",col="red")
qqline(crowdfunding$successful_rate)
qqnorm(crowdfunding$GiniCoeff, main ="GiniCoeff:Q-Q norm",col="blue")
qqline(crowdfunding$GiniCoeff)
qqnorm(crowdfunding$pAdDeg, main ="pAdDeg:Q-Q norm",col="green")
qqline(crowdfunding$pAdDeg)

cor.test(crowdfunding$successful_rate,crowdfunding$GiniCoeff)

    Pearson's product-moment correlation

data:  crowdfunding$successful_rate and crowdfunding$GiniCoeff
t = 3.0255, df = 48, p-value = 0.003981
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.1371263 0.6105363
sample estimates:
      cor 
0.4001989 
cor.test(crowdfunding$successful_rate,crowdfunding$pAdDeg,method="spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  crowdfunding$successful_rate and crowdfunding$pAdDeg
S = 12634, p-value = 0.004719
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.3933076 

Geography information:factors

boxplot(crowdfunding$GiniCoeff[crowdfunding$Region=="Midwest"],crowdfunding$GiniCoeff[crowdfunding$Region=="Northeast"],crowdfunding$GiniCoeff[crowdfunding$Region=="South"],crowdfunding$GiniCoeff[crowdfunding$Region=="West"],names=levels(crowdfunding$Region),main="GiniCoeff BoxPlot by Region",varwidth=TRUE)

boxplot(crowdfunding$pAdDeg[crowdfunding$Region=="Midwest"],crowdfunding$pAdDeg[crowdfunding$Region=="Northeast"],crowdfunding$pAdDeg[crowdfunding$Region=="South"],crowdfunding$pAdDeg[crowdfunding$Region=="West"],names=levels(crowdfunding$Region),main="pAdDeg BoxPlot by Region",varwidth=TRUE)
summary(lm(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$GiniCoeff[crowdfunding$Region=="Midwest"]))

Call:
lm(formula = crowdfunding$successful_rate[crowdfunding$Region == 
    "Midwest"] ~ crowdfunding$GiniCoeff[crowdfunding$Region == 
    "Midwest"])

Residuals:
      Min        1Q    Median        3Q       Max 
-0.159935 -0.042151  0.001007  0.042888  0.126971 

Coefficients:
                                                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)                                               -1.9201     0.9832  -1.953   0.0794 .
crowdfunding$GiniCoeff[crowdfunding$Region == "Midwest"]   5.1042     2.2205   2.299   0.0444 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08428 on 10 degrees of freedom
Multiple R-squared:  0.3457,    Adjusted R-squared:  0.2803 
F-statistic: 5.284 on 1 and 10 DF,  p-value: 0.04435
par(mfrow=c(1,4))

#GiniCoeff---------
plot(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$GiniCoeff[crowdfunding$Region=="Midwest"],xlab="GiniCoeff in Midwest",ylab="Successful rate in Midwest")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$GiniCoeff[crowdfunding$Region=="Midwest"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$GiniCoeff[crowdfunding$Region=="West"],xlab="GiniCoeff in West",ylab="Successful rate in West")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$GiniCoeff[crowdfunding$Region=="West"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$GiniCoeff[crowdfunding$Region=="South"],xlab="GiniCoeff in South",ylab="Successful rate in South")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$GiniCoeff[crowdfunding$Region=="South"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$GiniCoeff[crowdfunding$Region=="Northeast"],xlab="GiniCoeff in Northeast",ylab="Successful rate in Northeast")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$GiniCoeff[crowdfunding$Region=="Northeast"]),col="red",type="l")

#pAdDeg-----------
plot(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pAdDeg[crowdfunding$Region=="Midwest"],xlab="pAdDeg in Midwest",ylab="Successful rate in Midwest")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pAdDeg[crowdfunding$Region=="Midwest"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pAdDeg[crowdfunding$Region=="West"],xlab="pAdDeg in West",ylab="Successful rate in West")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pAdDeg[crowdfunding$Region=="West"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pAdDeg[crowdfunding$Region=="South"],xlab="pAdDeg in South",ylab="Successful rate in South")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pAdDeg[crowdfunding$Region=="South"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pAdDeg[crowdfunding$Region=="Northeast"],xlab="pAdDeg in Northeast",ylab="Successful rate in Northeast")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pAdDeg[crowdfunding$Region=="Northeast"]),col="red",type="l")

#pBatDeg-----------
plot(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pBatDeg[crowdfunding$Region=="Midwest"],xlab="pBatDeg in Midwest",ylab="Successful rate in Midwest")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pBatDeg[crowdfunding$Region=="Midwest"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pBatDeg[crowdfunding$Region=="West"],xlab="pBatDeg in West",ylab="Successful rate in West")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pBatDeg[crowdfunding$Region=="West"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pBatDeg[crowdfunding$Region=="South"],xlab="pBatDeg in South",ylab="Successful rate in South")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pBatDeg[crowdfunding$Region=="South"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pBatDeg[crowdfunding$Region=="Northeast"],xlab="pBatDeg in Northeast",ylab="Successful rate in Northeast")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pBatDeg[crowdfunding$Region=="Northeast"]),col="red",type="l")

#pHigh-----------
plot(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pHigh[crowdfunding$Region=="Midwest"],xlab="pHigh in Midwest",ylab="Successful rate in Midwest")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pHigh[crowdfunding$Region=="Midwest"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pHigh[crowdfunding$Region=="West"],xlab="pHigh in West",ylab="Successful rate in West")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pHigh[crowdfunding$Region=="West"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pHigh[crowdfunding$Region=="South"],xlab="pHigh in South",ylab="Successful rate in South")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pHigh[crowdfunding$Region=="South"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pHigh[crowdfunding$Region=="Northeast"],xlab="pHigh in Northeast",ylab="Successful rate in Northeast")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pHigh[crowdfunding$Region=="Northeast"]),col="red",type="l")

par(mfrow=c(1,4))
#GiniCoeff---------
plot(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$GiniCoeff[crowdfunding$Region=="Midwest"],xlab="GiniCoeff in Midwest",ylab="Successful rate in Midwest")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$GiniCoeff[crowdfunding$Region=="Midwest"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$GiniCoeff[crowdfunding$Region=="West"],xlab="GiniCoeff in West",ylab="Successful rate in West")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$GiniCoeff[crowdfunding$Region=="West"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$GiniCoeff[crowdfunding$Region=="South"],xlab="GiniCoeff in South",ylab="Successful rate in South")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$GiniCoeff[crowdfunding$Region=="South"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$GiniCoeff[crowdfunding$Region=="Northeast"],xlab="GiniCoeff in Northeast",ylab="Successful rate in Northeast")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$GiniCoeff[crowdfunding$Region=="Northeast"]),col="red",type="l")

#pAdDeg-----------
plot(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pAdDeg[crowdfunding$Region=="Midwest"],xlab="pAdDeg in Midwest",ylab="Successful rate in Midwest")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pAdDeg[crowdfunding$Region=="Midwest"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pAdDeg[crowdfunding$Region=="West"],xlab="pAdDeg in West",ylab="Successful rate in West")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pAdDeg[crowdfunding$Region=="West"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pAdDeg[crowdfunding$Region=="South"],xlab="pAdDeg in South",ylab="Successful rate in South")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pAdDeg[crowdfunding$Region=="South"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pAdDeg[crowdfunding$Region=="Northeast"],xlab="pAdDeg in Northeast",ylab="Successful rate in Northeast")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pAdDeg[crowdfunding$Region=="Northeast"]),col="red",type="l")

#pBatDeg-----------
plot(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pBatDeg[crowdfunding$Region=="Midwest"],xlab="pBatDeg in Midwest",ylab="Successful rate in Midwest")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pBatDeg[crowdfunding$Region=="Midwest"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pBatDeg[crowdfunding$Region=="West"],xlab="pBatDeg in West",ylab="Successful rate in West")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pBatDeg[crowdfunding$Region=="West"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pBatDeg[crowdfunding$Region=="South"],xlab="pBatDeg in South",ylab="Successful rate in South")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pBatDeg[crowdfunding$Region=="South"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pBatDeg[crowdfunding$Region=="Northeast"],xlab="pBatDeg in Northeast",ylab="Successful rate in Northeast")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pBatDeg[crowdfunding$Region=="Northeast"]),col="red",type="l")

#pHigh-----------
plot(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pHigh[crowdfunding$Region=="Midwest"],xlab="pHigh in Midwest",ylab="Successful rate in Midwest")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"]~crowdfunding$pHigh[crowdfunding$Region=="Midwest"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pHigh[crowdfunding$Region=="West"],xlab="pHigh in West",ylab="Successful rate in West")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="West"]~crowdfunding$pHigh[crowdfunding$Region=="West"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pHigh[crowdfunding$Region=="South"],xlab="pHigh in South",ylab="Successful rate in South")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="South"]~crowdfunding$pHigh[crowdfunding$Region=="South"]),col="red",type="l")
plot(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pHigh[crowdfunding$Region=="Northeast"],xlab="pHigh in Northeast",ylab="Successful rate in Northeast")
points(lowess(crowdfunding$successful_rate[crowdfunding$Region=="Northeast"]~crowdfunding$pHigh[crowdfunding$Region=="Northeast"]),col="red",type="l")

Geography information-t.test

#t.test(crowdfunding$successful_rate[crowdfunding$Region=="West"],crowdfunding$successful_rate[crowdfunding$Region=="Northeast"])
#t.test(crowdfunding$count_of_Grand.Total[crowdfunding$Region=="West"],crowdfunding$count_of_Grand.Total[crowdfunding$Region=="Northeast"])
#calcualte P Value in the t.test of Successful Rate by Region 
p=NULL
temp<-NULL
for (location1 in c(levels(crowdfunding$Region))){
  for (location2 in c(levels(crowdfunding$Region))){
    if (1){
      temp<-t.test(crowdfunding$successful_rate[crowdfunding$Region==location1],crowdfunding$successful_rate[crowdfunding$Region==location2])
      if(temp$p.value<=0.1){
        #print(c(location1,location2,temp$p.value))
      }
      p<-c(p,temp$p.value)}}}
SR.t.test.p.vlaue<-as.data.frame(matrix(p,4,4),row.names = c(levels(crowdfunding$Region)))
colnames(SR.t.test.p.vlaue)<-c(levels(crowdfunding$Region))
print("Successful Rate by Region")
[1] "Successful Rate by Region"
SR.t.test.p.vlaue
#--------------------------------------------------------
#calcualte P Value in the t.test of Count of projects by Region 
p=NULL
temp<-NULL
for (location1 in c(levels(crowdfunding$Region))){
  for (location2 in c(levels(crowdfunding$Region))){
    if (1){
      temp<-t.test(log(crowdfunding$count_of_Grand.Total[crowdfunding$Region==location1]),log(crowdfunding$count_of_Grand.Total[crowdfunding$Region==location2]))
      if(temp$p.value<=0.1){
        #print(c(location1,location2,temp$p.value))
      }
      p<-c(p,temp$p.value)}}}
CP.t.test.p.vlaue<-as.data.frame(matrix(p,4,4),row.names = c(levels(crowdfunding$Region)))
colnames(CP.t.test.p.vlaue)<-c(levels(crowdfunding$Region))
print("Count of Projects by Region ")
[1] "Count of Projects by Region "
CP.t.test.p.vlaue
#--------------------------------------------------------
#calcualte P Value in the t.test of Count of projects by kmeans 
"MDS-Category"
[1] "MDS-Category"
p=NULL
temp<-NULL
#for (location1 in 1:4){
#  for (location2 in 1:4){
#    if (1){
#      temp<-t.test(crowdfunding$successful_rate[crowdfunding$MDS_Category==location1],crowdfunding$successful_rate[crowdfunding$MDS_Category==location2])
#      if(temp$p.value<=0.1){
#        print(c(location1,location2,temp$p.value))
#      }
#      p<-c(p,temp$p.value)}}}
#MDSR.t.test.p.vlaue<-as.data.frame(matrix(p,4,4),row.names = c(1:4))
#colnames(MDSR.t.test.p.vlaue)<-c(1:4)
#print("Successful Rate by Region")
#MDSR.t.test.p.vlaue

Geography information-t-bootstrap

wilcox.test(Northeast.SR.bootstrap,West.SR.bootstrap)

    Wilcoxon rank sum test with continuity correction

data:  Northeast.SR.bootstrap and West.SR.bootstrap
W = 994490, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
wilcox.test(Northeast.SR.bootstrap,South.SR.bootstrap)

    Wilcoxon rank sum test with continuity correction

data:  Northeast.SR.bootstrap and South.SR.bootstrap
W = 988070, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
wilcox.test(Northeast.SR.bootstrap,Midwest.SR.bootstrap)

    Wilcoxon rank sum test with continuity correction

data:  Northeast.SR.bootstrap and Midwest.SR.bootstrap
W = 990780, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
wilcox.test(West.SR.bootstrap,Midwest.SR.bootstrap)

    Wilcoxon rank sum test with continuity correction

data:  West.SR.bootstrap and Midwest.SR.bootstrap
W = 471150, p-value = 0.02549
alternative hypothesis: true location shift is not equal to 0
wilcox.test(West.SR.bootstrap,South.SR.bootstrap)

    Wilcoxon rank sum test with continuity correction

data:  West.SR.bootstrap and South.SR.bootstrap
W = 207160, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
wilcox.test(Midwest.SR.bootstrap,South.SR.bootstrap)

    Wilcoxon rank sum test with continuity correction

data:  Midwest.SR.bootstrap and South.SR.bootstrap
W = 260520, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0

Geography information-wilcox.test

wilcox.test(crowdfunding$successful_rate[crowdfunding$Region=="West"],crowdfunding$successful_rate[crowdfunding$Region=="Northeast"])

    Wilcoxon rank sum test

data:  crowdfunding$successful_rate[crowdfunding$Region == "West"] and crowdfunding$successful_rate[crowdfunding$Region == "Northeast"]
W = 29, p-value = 0.05135
alternative hypothesis: true location shift is not equal to 0
wilcox.test(crowdfunding$successful_rate[crowdfunding$Region=="Midwest"],crowdfunding$successful_rate[crowdfunding$Region=="Northeast"])

    Wilcoxon rank sum test

data:  crowdfunding$successful_rate[crowdfunding$Region == "Midwest"] and crowdfunding$successful_rate[crowdfunding$Region == "Northeast"]
W = 28, p-value = 0.06928
alternative hypothesis: true location shift is not equal to 0
wilcox.test(crowdfunding$successful_rate[crowdfunding$Region=="South"],crowdfunding$successful_rate[crowdfunding$Region=="Northeast"])
cannot compute exact p-value with ties

    Wilcoxon rank sum test with continuity correction

data:  crowdfunding$successful_rate[crowdfunding$Region == "South"] and crowdfunding$successful_rate[crowdfunding$Region == "Northeast"]
W = 43, p-value = 0.1066
alternative hypothesis: true location shift is not equal to 0
wilcox.test(crowdfunding$successful_rate[crowdfunding$Region=="West"],crowdfunding$successful_rate[crowdfunding$Region=="Midwest"])
cannot compute exact p-value with ties

    Wilcoxon rank sum test with continuity correction

data:  crowdfunding$successful_rate[crowdfunding$Region == "West"] and crowdfunding$successful_rate[crowdfunding$Region == "Midwest"]
W = 75, p-value = 0.8918
alternative hypothesis: true location shift is not equal to 0

Factors analysis

This article is to analyse the factors to the crowdfunding successful rate. I guess the Education, the inequity of family income and the poverty rate may be related to the crowdfunding successful rate. and in the follow context, i will analyse the those factors.

Firstly, The Statistical Summary ### Factors Analysis-Statistical Summary

library(moments)
summary(crowdfunding$successful_rate)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.1250  0.3179  0.3636  0.3631  0.4095  0.5484 
kurtosis(crowdfunding$successful_rate)
[1] 3.630147
summary(crowdfunding$GiniCoeff)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.4190  0.4400  0.4530  0.4522  0.4658  0.4990 
kurtosis(crowdfunding$GiniCoeff)
[1] 2.552647
summary(crowdfunding$pAdDeg)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.06100 0.07950 0.09200 0.09794 0.11000 0.16400 
kurtosis(crowdfunding$pAdDeg)
[1] 3.382781
summary(crowdfunding$PovRate1)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0920  0.1212  0.1480  0.1480  0.1705  0.2190 
kurtosis(crowdfunding$PovRate1)
[1] 2.159154

Factors Analysis-Plot for Factors

boxplot(crowdfunding$successful_rate,crowdfunding$GiniCoeff,crowdfunding$pAdDeg,crowdfunding$PovRate1,names = c("Successful Rate","GiniCoeff","Higher Education","PovRate1"),main="Factors Box Plot")
par(mfrow=c(1,4))

plot(crowdfunding$successful_rate,col=crowdfunding$Region,pch=10,cex=1.5,xlab="State",ylab="Successful Rate",xaxt="n",main="Successful Rate Plot with lowess line")
points(lowess(crowdfunding$successful),type="l")
legend("topleft",legend = levels(crowdfunding$Region),cex = 0.8, pch = 1,col=1:4)
plot(crowdfunding$GiniCoeff,col=crowdfunding$Region,pch=18,cex=1.5,xlab="State",xaxt="n",ylab="GiniCoeff ",xaxt="n",main="GiniCoeff Plot with lowess line")
points(lowess(crowdfunding$GiniCoeff),type="l")
legend("topleft",legend = levels(crowdfunding$Region),cex = 0.8, pch = 1,col=1:4)
plot(crowdfunding$pAdDeg,col=crowdfunding$Region,pch=15,cex=1.5,xlab="State",xaxt="n",ylab="Adanced Education Rate",xaxt="n",main="Adanced Education Rate Plot with lowess line")
points(lowess(crowdfunding$pAdDeg),type="l")
legend("topright",legend = levels(crowdfunding$Region),cex = 0.8, pch = 1,col=1:4)
plot(crowdfunding$pAdDeg,col=crowdfunding$Region,pch=15,cex=1.5,xlab="State",xaxt="n",ylab="Adanced Education Rate",xaxt="n",main="Adanced Education Rate Plot with lowess line")
points(lowess(crowdfunding$pAdDeg),type="l")
legend("topright",legend = levels(crowdfunding$Region),cex = 0.8, pch = 1,col=1:4)

require(car)
Loading required package: car
package 'car' was built under R version 3.3.2
scatterplotMatrix(~successful_rate+PovRate1+pAdDeg,data=crowdfunding,spread=1,upper.panel=NULL,main="Scatter Plot Matrix on Factors")

require(moments)
kurtosis(crowdfunding$pAdDeg)
[1] 3.382781
#plot(crowdfunding$PovRate1,col="black",pch=16,xlab="State",xaxt="n",ylab="Poverty Rate",xaxt="n",main="Poverty Rate Plot")
#library(gridExtra)
summary(lm(log(successful_rate)~log(Collectivism),data=crowdfunding))

Call:
lm(formula = log(successful_rate) ~ log(Collectivism), data = crowdfunding)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.88745 -0.11958  0.01185  0.12325  0.51358 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -2.7061     0.7085  -3.819 0.000384 ***
log(Collectivism)   0.4259     0.1819   2.341 0.023406 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.2802 on 48 degrees of freedom
Multiple R-squared:  0.1025,    Adjusted R-squared:  0.08381 
F-statistic: 5.483 on 1 and 48 DF,  p-value: 0.02341
ggplot(crowdfunding,aes(y=successful_rate,x=Collectivism))+geom_point()+geom_smooth(method="lm")

library(car)
scatterplot(crowdfunding$successful_rate,log(crowdfunding$average_of_goal_Grand.Total),pch=19)

scatterplot(crowdfunding$successful_rate~crowdfunding$GiniCoeff,pch=19)

scatterplot(crowdfunding$successful_rate~crowdfunding$PovRate1,pch=19)

scatterplot(crowdfunding$successful_rate~crowdfunding$Densitym2,pch=19)

scatterplot(crowdfunding$successful_rate~crowdfunding$pHigh,pch=19)

scatterplot(crowdfunding$successful_rate~crowdfunding$pBatDeg,pch=19)

scatterplot(crowdfunding$successful_rate~crowdfunding$pAdDeg,pch=19)

Factors Analysis-Successful Rate|PovRate1

#redo scatterplot with Successful Rate-PovRate1
scatterplot(crowdfunding$successful_rate,crowdfunding$PovRate1,pch=19)

#anova(successful_rate2PovRate1)
library(ggplot2)
ggplot(crowdfunding,aes(x=PovRate1,y=successful_rate,main = "Successful rate~PovRate"))+geom_point(aes(col=Region))+geom_smooth(method = "loess")+ggtitle("Successful Rate-PovRate1 Plot")+theme(plot.title=element_text(hjust=0.5))
par(mfrow=c(1,2))

boxplot(crowdfunding$successful_rate,crowdfunding$PovRate1,names=c("Successful Rate","PovRate1"))
boxplot(crowdfunding$successful_rate[crowdfunding$PovRate1>mean(crowdfunding$PovRate1)],crowdfunding$successful_rate[crowdfunding$PovRate1<=mean(crowdfunding$PovRate1)],col = c("green","deepskyblue"),names=c("Successful%(High PovRate)","Successful%(Low PovRate)"),xlab="Successful rate by PovRate1")

t.test(crowdfunding$successful_rate[crowdfunding$PovRate1>mean(crowdfunding$PovRate1)],crowdfunding$successful_rate[crowdfunding$PovRate1<=mean(crowdfunding$PovRate1)])

    Welch Two Sample t-test

data:  crowdfunding$successful_rate[crowdfunding$PovRate1 > mean(crowdfunding$PovRate1)] and crowdfunding$successful_rate[crowdfunding$PovRate1 <= mean(crowdfunding$PovRate1)]
t = -0.01904, df = 43.704, p-value = 0.9849
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.05105839  0.05010288
sample estimates:
mean of x mean of y 
0.3628157 0.3632935 
plot(crowdfunding$PovRate1,crowdfunding$successful_rate,pch=19,col=crowdfunding$Region,ylab="Successful Rate",xlab="PovRate1",main="Successful Rate-PovRate1 Plot with lowess line")
points(lowess(crowdfunding$PovRate1,crowdfunding$successful_rate,f=1/3),pch=4,col="orange",type="l")
#abline(lm(crowdfunding$successful_rate~crowdfunding$PovRate1),col="orange")
legend("bottomright",legend = levels(crowdfunding$Region),cex = 0.8, pch = 19,col=1:4)
qqplot(crowdfunding$PovRate1,crowdfunding$successful_rate,pch=1,col=crowdfunding$Region,main="QQ plot: (Successful Rate & PovRate)")
qqline(crowdfunding$PovRate1 ,crowdfunding$successful_rate,col="red")
the condition has length > 1 and only the first element will be used
legend("topleft",legend = levels(crowdfunding$Region), pch = 19,col=1:3)
par(mfrow=c(1,1))

#qqnorm(crowdfunding$successful_rate,col=crowdfunding$Region,xlab="Successful Rate")
#qqline(crowdfunding$successful_rate,col="red")
qqnorm(crowdfunding$PovRate1,col=crowdfunding$Region,pch=18,xlab ="PovRate1")
qqline(crowdfunding$PovRate1,col="red")

require(ggplot2)
ggplot(crowdfunding,aes(x=PovRate1,y=successful_rate,main = "Successful rate~PovRate1"))+geom_point(aes(group=1,col=Region))+geom_smooth(method = "loess",se=FALSE,aes(group=2,col="Loess Line"),lty="dashed")+geom_smooth(method = "lm",aes(group=2,col="Regression Line"),cex=0.8,lty=1)+ggtitle("Successful Rate-PovRate1 Plot with Loess line and OLS-estimated line")+labs(x="PovRate1",y="Successful Rate")+theme(plot.title=element_text(hjust=0.5))+scale_colour_manual(values = c("purple", "magenta", "orange","red", "blue", "green3" ),guide = guide_legend(title="Legend",override.aes = list(linetype = c( "dashed",rep("blank", 2), "solid",rep("blank", 2)),shape = c(NA,rep(16, 2), NA,rep(16, 2) ))))

require(lmtest)
require(strucchange)
Loading required package: strucchange
Loading required package: sandwich
resettest(crowdfunding$successful_rate~crowdfunding$GiniCoeff+(crowdfunding$GiniCoeff)^2)

    RESET test

data:  crowdfunding$successful_rate ~ crowdfunding$GiniCoeff + (crowdfunding$GiniCoeff)^2
RESET = 0.62108, df1 = 2, df2 = 46, p-value = 0.5418
sctest(log(crowdfunding$successful_rate)~log(crowdfunding$GiniCoeff),type="Chow")

    Chow test

data:  log(crowdfunding$successful_rate) ~ log(crowdfunding$GiniCoeff)
F = 2.5789, p-value = 0.08679
resettest(log(crowdfunding$successful_rate)~log(crowdfunding$pAdDeg))

    RESET test

data:  log(crowdfunding$successful_rate) ~ log(crowdfunding$pAdDeg)
RESET = 1.7729, df1 = 2, df2 = 46, p-value = 0.1812
sctest(crowdfunding$successful_rate~crowdfunding$pAdDeg,type="Chow",point=0.12)

    Chow test

data:  crowdfunding$successful_rate ~ crowdfunding$pAdDeg
F = 0.55801, p-value = 0.5762
plot(crowdfunding$successful_rate~crowdfunding$pAdDeg)
points(lowess(crowdfunding$successful_rate~crowdfunding$pAdDeg),type="l")

b=NA
for (i in 150:170){
a<-sctest(log(crowdfunding$successful_rate)~log(crowdfunding$pAdDeg),type="Chow",point=i/1000)
b[i]=a$p.value
#if (a$p.value<=0.05){print (i/100)}
}
plot(b,type="l")

b[9]
[1] NA
sctest(log(crowdfunding$successful_rate)~log(crowdfunding$pAdDeg),type="Chow",point=0.17)

    Chow test

data:  log(crowdfunding$successful_rate) ~ log(crowdfunding$pAdDeg)
F = 1.9269, p-value = 0.1572

Factors Analysis-Successful Rate|GiniCoeff

ggplot(crowdfunding,aes(x=GiniCoeff,y=successful_rate,main = "Successful rate~GiniCoeff"))+geom_point(group=1,aes(col=Region))+geom_smooth(method = "loess",se=FALSE,lty="dashed",aes(group=2,col="Trendline"))+geom_smooth(method = "lm",aes(group=2,col="Regression"),lty=1,cex=0.5)+ggtitle("Successful Rate-GiniCoeff Plot with loess line and OLS-estimated line")+labs(x="GiniCoeff",y="Successful Rate")+theme(plot.title=element_text(hjust=0.5))
anova(successful_rate2GiniCoeff)
Analysis of Variance Table

Response: crowdfunding$successful_rate
                       Df  Sum Sq  Mean Sq F value   Pr(>F)   
crowdfunding$GiniCoeff  1 0.06236 0.062361  9.1537 0.003981 **
Residuals              48 0.32701 0.006813                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
t.test(crowdfunding$successful_rate[crowdfunding$GiniCoeff>mean(crowdfunding$GiniCoeff)],crowdfunding$successful_rate[crowdfunding$GiniCoeff<=mean(crowdfunding$GiniCoeff)])

    Welch Two Sample t-test

data:  crowdfunding$successful_rate[crowdfunding$GiniCoeff > mean(crowdfunding$GiniCoeff)] and crowdfunding$successful_rate[crowdfunding$GiniCoeff <= mean(crowdfunding$GiniCoeff)]
t = 1.6383, df = 43.111, p-value = 0.1086
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.009375926  0.090607105
sample estimates:
mean of x mean of y 
0.3833720 0.3427564 
par(mfrow=c(1,2))

boxplot(crowdfunding$successful_rate,crowdfunding$GiniCoeff,names=c("Successful Rate","GiniCoeff"))
boxplot(crowdfunding$successful_rate[crowdfunding$GiniCoeff>mean(crowdfunding$GiniCoeff)],crowdfunding$successful_rate[crowdfunding$GiniCoeff<=mean(crowdfunding$GiniCoeff)],col = c("darkorchid2","dodgerblue"),names=c("Successful%(High GiniCoeff)","Successful%(Low GiniCoeff)"),xlab="Successful rate by GiniCoeff")

plot(crowdfunding$successful_rate,crowdfunding$GiniCoeff,f=1/3 ,pch=19,col="blue",xlab="Successful Rate",ylab="GiniCoeff",main="Successful Rate-GiniCoeff Plot with lowess line")
points(lowess(crowdfunding$successful_rate,crowdfunding$GiniCoeff,f=1/3),pch=4,col="red",type="l")
qqplot(crowdfunding$GiniCoeff,crowdfunding$successful_rate,pch=18,main="Q-Q Plot: Successful Rate-GiniCoeff with lowess line",xlab="Gini Coefficient",ylab="Successful Rate")
points(lowess(crowdfunding$GiniCoeff,crowdfunding$successful_rate),type="l",col="red")
#qqline(crowdfunding$successful_rate,crowdfunding$GiniCoeff)
#qqnorm(crowdfunding$successful_rate,col="orange",xlab="Successful Rate")
#qqline(crowdfunding$successful_rate,col="red")
par(mfrow=c(1,1))

qqnorm(crowdfunding$GiniCoeff,col="blue",pch=20,xlab="GiniCoeff")
qqline(crowdfunding$GiniCoeff,col="red")

summary(lm(crowdfunding$successful_rate~crowdfunding$GiniCoeff))

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$GiniCoeff)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.197648 -0.054730 -0.003818  0.055170  0.201729 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)   
(Intercept)             -0.5417     0.2993  -1.810  0.07655 . 
crowdfunding$GiniCoeff   2.0008     0.6613   3.026  0.00398 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08254 on 48 degrees of freedom
Multiple R-squared:  0.1602,    Adjusted R-squared:  0.1427 
F-statistic: 9.154 on 1 and 48 DF,  p-value: 0.003981
ggplot(crowdfunding,aes(x=GiniCoeff,y=successful_rate,main = "Successful rate~GiniCoeff"))+geom_point(aes(group=1,col=Region))+geom_smooth(method = "loess",se=FALSE,aes(group=2,col="Loess Line"),lty="dashed")+geom_smooth(method = "lm",aes(group=2,col="Regression Line"),cex=0.8,lty=1)+ggtitle("Successful Rate-GiniCoeff Plot with Loess line and OLS-estimated line")+labs(x="GiniCoeff",y="Successful Rate")+theme(plot.title=element_text(hjust=0.5))+scale_colour_manual(values = c("purple", "magenta", "orange","red", "blue", "green3" ),guide = guide_legend(title="Legend",override.aes = list(linetype = c( "dashed",rep("blank", 2), "solid",rep("blank", 2)),shape = c(NA,rep(16, 2), NA,rep(16, 2) ))))

Factors Analysis-Successful Rate|Advanced Education]

ggplot(crowdfunding,aes(x=pAdDeg,y=successful_rate))+geom_point(aes(col=Region))+geom_smooth(method = "loess",se=FALSE,lty=2,aes(col="Loess Line"))+geom_smooth(method = "lm",aes(col="Regression Line"),cex=0.8)+ggtitle("Successful Rate-Adanced Education Plot with Loess line and OLS-estimated line")+labs(x="Advanced Education",y="Successful Rate")+theme(plot.title=element_text(hjust=0.5))+scale_colour_manual(values = c("purple", "magenta","orange", "red", "blue", "green3" ),guide = guide_legend(title="Legend",override.aes = list(linetype = c( "dashed",rep("blank", 2), "solid",rep("blank", 2)),shape = c( NA,rep(16, 2), NA,rep(16, 2)))))

ggplot(crowdfunding,aes(x=pAdDeg,y=successful_rate))+geom_point(aes(col=Region))+geom_smooth(method = "loess",se=FALSE,lty=2)+geom_smooth(method = "lm",col="red",cex=0.8)+ggtitle("Successful Rate-Adanced Education Plot")+labs(x="Advanced Education",y="Successful Rate")+theme(plot.title=element_text(hjust=0.5))

plot(lowess(crowdfunding$pAdDeg,crowdfunding$successful_rate))
anova(successful_rate2pAdDeg)
Analysis of Variance Table

Response: crowdfunding$successful_rate
                    Df  Sum Sq  Mean Sq F value   Pr(>F)   
crowdfunding$pAdDeg  1 0.05947 0.059469  8.6527 0.005015 **
Residuals           48 0.32990 0.006873                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
par(mfrow=c(1,2))

boxplot(crowdfunding$successful_rate,crowdfunding$pAdDeg,names=c("Successful rate","Adanced Education"))
boxplot(crowdfunding$successful_rate[crowdfunding$pAdDeg>mean(crowdfunding$pAdDeg)],crowdfunding$successful_rate[crowdfunding$pAdDeg<=mean(crowdfunding$pAdDeg)],col = c("darkorchid2","dodgerblue"),names=c("Successful%(High Adanced Education)","Successful%(Low Adanced Education)"),xlab="Successful rate by Adanced Education")

t.test(crowdfunding$successful_rate[crowdfunding$pAdDeg>mean(crowdfunding$pAdDeg)],crowdfunding$successful_rate[crowdfunding$pAdDeg<=mean(crowdfunding$pAdDeg)])

    Welch Two Sample t-test

data:  crowdfunding$successful_rate[crowdfunding$pAdDeg > mean(crowdfunding$pAdDeg)] and crowdfunding$successful_rate[crowdfunding$pAdDeg <= mean(crowdfunding$pAdDeg)]
t = 3.5483, df = 45.573, p-value = 0.0009119
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.03480093 0.12610121
sample estimates:
mean of x mean of y 
0.4097258 0.3292747 
plot(crowdfunding$successful_rate,crowdfunding$pAdDeg,f=1/3 ,pch=19,col="blue",xlab="Successful Rate",ylab="Adanced Education",main="Successful Rate-Adanced Education Plot with lowess line")
points(lowess(crowdfunding$successful_rate,crowdfunding$pAdDeg,f=1/3),pch=4,col="red",type="l")
qqplot(crowdfunding$successful_rate,crowdfunding$pAdDeg,pch=19,col="red",main="Q-Q Plot: Successful Rate-Adanced Education")
qqline(crowdfunding$successful_rate,crowdfunding$pAdDeg)
the condition has length > 1 and only the first element will be used
#qqnorm(crowdfunding$successful_rate,col="orange",xlab="Successful Rate")
#qqline(crowdfunding$successful_rate,col="red")
par(mfrow=c(1,1))

qqnorm(crowdfunding$pAdDeg,col="blue",pch=20,xlab="Adanced Education")
qqline(crowdfunding$pAdDeg,col="red")

summary(lm(crowdfunding$successful_rate~crowdfunding$pAdDeg))

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$pAdDeg)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.22412 -0.06718  0.01152  0.04708  0.15306 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          0.22570    0.04815   4.688 2.31e-05 ***
crowdfunding$pAdDeg  1.40251    0.47679   2.942  0.00501 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.0829 on 48 degrees of freedom
Multiple R-squared:  0.1527,    Adjusted R-squared:  0.1351 
F-statistic: 8.653 on 1 and 48 DF,  p-value: 0.005015

Factors Analysis- Ginicoeff|Advanced Education

require(ggplot2)
ggplot(crowdfunding,aes(x=pAdDeg,y=GiniCoeff))+geom_point(aes(col=Region))+geom_smooth(method = "loess",se=FALSE,lty=2)+geom_smooth(method = "lm",col="red",cex=0.8)+ggtitle("Successful Rate-Adanced Education Plot")+labs(x="Advanced Education",y="GiniCoeff")+theme(plot.title=element_text(hjust=0.5))

plot(lowess(crowdfunding$pAdDeg,crowdfunding$GiniCoeff))
par(mfrow=c(1,2))

boxplot(crowdfunding$GiniCoeff,crowdfunding$pAdDeg,names=c("Successful rate","Adanced Education"))
boxplot(crowdfunding$GiniCoeff[crowdfunding$pAdDeg>mean(crowdfunding$pAdDeg)],crowdfunding$GiniCoeff[crowdfunding$pAdDeg<=mean(crowdfunding$pAdDeg)],col = c("darkorchid2","dodgerblue"),names=c("GiniCoeff(High Adanced Education)","GiniCoeff(Low Adanced Education)"),xlab="GiniCoeff by Adanced Education")

t.test(crowdfunding$GiniCoeff[crowdfunding$pAdDeg>mean(crowdfunding$pAdDeg)],crowdfunding$GiniCoeff[crowdfunding$pAdDeg<=mean(crowdfunding$pAdDeg)])

    Welch Two Sample t-test

data:  crowdfunding$GiniCoeff[crowdfunding$pAdDeg > mean(crowdfunding$pAdDeg)] and crowdfunding$GiniCoeff[crowdfunding$pAdDeg <= mean(crowdfunding$pAdDeg)]
t = 1.6166, df = 41.849, p-value = 0.1135
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.002035865  0.018423386
sample estimates:
mean of x mean of y 
0.4569524 0.4487586 
plot(crowdfunding$GiniCoeff,crowdfunding$pAdDeg,f=1/3 ,pch=19,col="blue",xlab="Successful Rate",ylab="Adanced Education",main="GiniCoeff-Adanced Education Plot with lowess line")
points(lowess(crowdfunding$GiniCoeff,crowdfunding$pAdDeg,f=1/3),pch=4,col="red",type="l")
qqplot(crowdfunding$GiniCoeff,crowdfunding$pAdDeg,pch=19,col="red",main="Q-Q Plot: GiniCoeff-Adanced Education")
qqline(crowdfunding$GiniCoeff,crowdfunding$pAdDeg)
the condition has length > 1 and only the first element will be used
#qqnorm(crowdfunding$GiniCoeff,col="orange",xlab="GiniCoeff")
#qqline(crowdfunding$GiniCoeff,col="red")
par(mfrow=c(1,1))

qqnorm(crowdfunding$pAdDeg,col="blue",pch=20,xlab="Adanced Education")
qqline(crowdfunding$pAdDeg,col="red")

require(corpcor)
Loading required package: corpcor
require(ggm)
Loading required package: ggm
Loading required package: igraph

Attaching package: 'igraph'

The following objects are masked from 'package:stats':

    decompose, spectrum

The following object is masked from 'package:base':

    union


Attaching package: 'ggm'

The following object is masked from 'package:igraph':

    pa
xcor=cor(se)#<e7><9b><b8><e5><85><b3><e7><b3><bb><e6><95><b0><e7><9f><a9><e9><98><b5> 
xpcor=cor2pcor(xcor)#<e5><81><8f><e7><9b><b8><e5><85><b3><e7><9f><a9><e9><98><b5>
xpcor
          [,1]      [,2]      [,3]
[1,] 1.0000000 0.1683237 0.3227919
[2,] 0.1683237 1.0000000 0.3102785
[3,] 0.3227919 0.3102785 1.0000000
xcor
                GiniCoeff    pAdDeg successful_rate
GiniCoeff       1.0000000 0.2983904       0.4001989
pAdDeg          0.2983904 1.0000000       0.3908097
successful_rate 0.4001989 0.3908097       1.0000000
require(psych)
Loading required package: psych

Attaching package: 'psych'

The following object is masked from 'package:car':

    logit

The following objects are masked from 'package:ggplot2':

    %+%, alpha
u<-colnames(xcor)
u
[1] "GiniCoeff"       "pAdDeg"          "successful_rate"
pcortest_dev<-function(x_set,y,dataset){
  require(psych)
  require(ggm)
  for (nv in length(x_set) ){
    
    data_subset<-dataset
    data_subset[x_set[nv]]<-NULL
    x_subset=x_set
    x_subset=x_subset[-nv]
    jsbl <- c(x_subset,y)   #<e8><a6><81><e8><ae><a1><e7><ae><97><e7><9a><84><e7><9b><b8><e5><85><b3><e7><b3><bb><e6><95><b0><e7><9a><84><e5><8f><98><e9><87><8f><e4><b8><8b><e6><a0><87>
    tjbl <- c(x_set[nv])  #<e6><9d><a1><e4><bb><b6>(<e6><8e><a7><e5><88><b6>)<e5><8f><98><e9><87><8f><e7><9a><84><e4><b8><8b><e6><a0><87><ef><bc><8c><e5><8d><b3><e8><a6><81><e6><8e><92><e9><99><a4><e5><bd><b1><e5><93><8d><e7><9a><84><e5><8f><98><e9><87><8f><e7><9a><84><e4><b8><8b><e6><a0><87>
    r<-pcor(c(jsbl,tjbl),cor(dataset))
    q <- length(tjbl) 
    n <- dim(dataset)[1]
    print(x_set[nv])
    pcor_test<- pcor.test(r,q,n)
   
    print(pcor_test)
  }
  return(pcor_test)
}
pcortest_dev(c("GiniCoeff","pAdDeg"),c("successful_rate"),se)
[1] "pAdDeg"
$tval
[1] 2.338108

$df
[1] 47

$pvalue
[1] 0.02368857

$tval
[1] 2.338108

$df
[1] 47

$pvalue
[1] 0.02368857
a<-1
a1_temp=lm(crowdfunding$successful_rate~crowdfunding$GiniCoeff)
b1_temp=lm(crowdfunding$pAdDeg~crowdfunding$GiniCoeff)
cor.test(a1_temp$residuals,b1_temp$residuals)

    Pearson's product-moment correlation

data:  a1_temp$residuals and b1_temp$residuals
t = 2.2613, df = 48, p-value = 0.02831
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.03494915 0.54183081
sample estimates:
      cor 
0.3102785 
a2_temp=lm(crowdfunding$successful_rate~crowdfunding$pAdDeg)
b2_temp=lm(crowdfunding$GiniCoeff~crowdfunding$pAdDeg)
se_s[1]
jsbl <- c("pAdDeg","successful_rate")   #<e8><a6><81><e8><ae><a1><e7><ae><97><e7><9a><84><e7><9b><b8><e5><85><b3><e7><b3><bb><e6><95><b0><e7><9a><84><e5><8f><98><e9><87><8f><e4><b8><8b><e6><a0><87>
tjbl <- c("GiniCoeff")  #<e6><9d><a1><e4><bb><b6>(<e6><8e><a7><e5><88><b6>)<e5><8f><98><e9><87><8f><e7><9a><84><e4><b8><8b><e6><a0><87><ef><bc><8c><e5><8d><b3><e8><a6><81><e6><8e><92><e9><99><a4><e5><bd><b1><e5><93><8d><e7><9a><84><e5><8f><98><e9><87><8f><e7><9a><84><e4><b8><8b><e6><a0><87>
jsbl <- c("GiniCoeff","successful_rate")   #<e8><a6><81><e8><ae><a1><e7><ae><97><e7><9a><84><e7><9b><b8><e5><85><b3><e7><b3><bb><e6><95><b0><e7><9a><84><e5><8f><98><e9><87><8f><e4><b8><8b><e6><a0><87>
tjbl <- c("pAdDeg")  #<e6><9d><a1><e4><bb><b6>(<e6><8e><a7><e5><88><b6>)<e5><8f><98><e9><87><8f><e7><9a><84><e4><b8><8b><e6><a0><87><ef><bc><8c><e5><8d><b3><e8><a6><81><e6><8e><92><e9><99><a4><e5><bd><b1><e5><93><8d><e7><9a><84><e5><8f><98><e9><87><8f><e7><9a><84><e4><b8><8b><e6><a0><87>
r<-pcor(c(jsbl,tjbl),cor(se))
q <- length(tjbl)   #<e8><ae><a1><e7><ae><97><e8><a6><81><e6><8e><a7><e5><88><b6><e7><9a><84><e5><8f><98><e9><87><8f><e6><95><b0>
n <- dim(se)[1]  #<e8><ae><a1><e7><ae><97><e6><a0><b7><e6><9c><ac><e9><87><8f>
pcor_test.GiniCoeff <- pcor.test(r,q,n) #<e5><81><8f><e7><9b><b8><e5><85><b3><e7><b3><bb><e6><95><b0><e6><98><be><e8><91><97><e6><80><a7><e6><a3><80><e9><aa><8c><e7><bb><93><e6><9e><9c><ef><bc><88><e8><be><93><e5><87><ba><e5><ba><8f><e5><8f><b7>3<ef><bc><89>
r.GiniCoeff=r
pcor_test.GiniCoeff
$tval
[1] 2.338108

$df
[1] 47

$pvalue
[1] 0.02368857
pcor_test.pAdDeg <- pcor.test(r,q,n)
r.pAdDeg=r
pcor_test.pAdDeg
$tval
[1] 2.338108

$df
[1] 47

$pvalue
[1] 0.02368857
corr.test(se,use="pairwise")
Call:corr.test(x = se, use = "pairwise")
Correlation matrix 
                GiniCoeff pAdDeg successful_rate
GiniCoeff             1.0   0.30            0.40
pAdDeg                0.3   1.00            0.39
successful_rate       0.4   0.39            1.00
Sample Size 
[1] 50
Probability values (Entries above the diagonal are adjusted for multiple tests.) 
                GiniCoeff pAdDeg successful_rate
GiniCoeff            0.00   0.04            0.01
pAdDeg               0.04   0.00            0.01
successful_rate      0.00   0.01            0.00

 To see confidence intervals of the correlations, print with the short=FALSE option
summary(lm(crowdfunding$GiniCoeff~crowdfunding$pAdDeg))

Call:
lm(formula = crowdfunding$GiniCoeff ~ crowdfunding$pAdDeg)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.031714 -0.014215  0.001214  0.013231  0.037791 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         0.431222   0.009986  43.184   <2e-16 ***
crowdfunding$pAdDeg 0.214191   0.098889   2.166   0.0353 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.01719 on 48 degrees of freedom
Multiple R-squared:  0.08904,   Adjusted R-squared:  0.07006 
F-statistic: 4.691 on 1 and 48 DF,  p-value: 0.03531
cor.test(crowdfunding$GiniCoeff,crowdfunding$pAdDeg)

    Pearson's product-moment correlation

data:  crowdfunding$GiniCoeff and crowdfunding$pAdDeg
t = 2.166, df = 48, p-value = 0.03531
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.02185813 0.53250982
sample estimates:
      cor 
0.2983904 
summary(lm(log(crowdfunding$GiniCoeff)~log(crowdfunding$pAdDeg)))

Call:
lm(formula = log(crowdfunding$GiniCoeff) ~ log(crowdfunding$pAdDeg))

Residuals:
      Min        1Q    Median        3Q       Max 
-0.073531 -0.032117  0.002537  0.028966  0.082244 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept)              -0.69086    0.05426 -12.732   <2e-16 ***
log(crowdfunding$pAdDeg)  0.04401    0.02295   1.918   0.0611 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.03835 on 48 degrees of freedom
Multiple R-squared:  0.07116,   Adjusted R-squared:  0.05181 
F-statistic: 3.677 on 1 and 48 DF,  p-value: 0.06112
cor.test(log(crowdfunding$GiniCoeff),log(crowdfunding$pAdDeg))

    Pearson's product-moment correlation

data:  log(crowdfunding$GiniCoeff) and log(crowdfunding$pAdDeg)
t = 1.9176, df = 48, p-value = 0.06112
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.01251929  0.50742841
sample estimates:
     cor 
0.266758 
qqplot(log(crowdfunding$successful_rate),log(crowdfunding$GiniCoeff))

qqplot(log(crowdfunding$successful_rate),log(crowdfunding$pAdDeg))
require(gvlma)
Loading required package: gvlma
summary(gvlma(lm(log(crowdfunding$successful_rate)~log(crowdfunding$pAdDeg))))

Call:
lm(formula = log(crowdfunding$successful_rate) ~ log(crowdfunding$pAdDeg))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.99585 -0.16975  0.06631  0.15860  0.35118 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)              -0.02673    0.39131  -0.068   0.9458  
log(crowdfunding$pAdDeg)  0.43484    0.16552   2.627   0.0115 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.2766 on 48 degrees of freedom
Multiple R-squared:  0.1257,    Adjusted R-squared:  0.1075 
F-statistic: 6.902 on 1 and 48 DF,  p-value: 0.01152


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = lm(log(crowdfunding$successful_rate) ~ log(crowdfunding$pAdDeg))) 

                      Value   p-value                   Decision
Global Stat        63.40303 5.582e-13 Assumptions NOT satisfied!
Skewness           23.67087 1.143e-06 Assumptions NOT satisfied!
Kurtosis           35.36041 2.740e-09 Assumptions NOT satisfied!
Link Function       0.01624 8.986e-01    Assumptions acceptable.
Heteroscedasticity  4.35552 3.689e-02 Assumptions NOT satisfied!
summary(gvlma(lm(crowdfunding$successful_rate~crowdfunding$pAdDeg)))

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$pAdDeg)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.22412 -0.06718  0.01152  0.04708  0.15306 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          0.22570    0.04815   4.688 2.31e-05 ***
crowdfunding$pAdDeg  1.40251    0.47679   2.942  0.00501 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.0829 on 48 degrees of freedom
Multiple R-squared:  0.1527,    Adjusted R-squared:  0.1351 
F-statistic: 8.653 on 1 and 48 DF,  p-value: 0.005015


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = lm(crowdfunding$successful_rate ~ crowdfunding$pAdDeg)) 

                    Value p-value                Decision
Global Stat        4.3514  0.3605 Assumptions acceptable.
Skewness           1.8403  0.1749 Assumptions acceptable.
Kurtosis           0.1144  0.7351 Assumptions acceptable.
Link Function      0.6963  0.4040 Assumptions acceptable.
Heteroscedasticity 1.7004  0.1922 Assumptions acceptable.
summary(gvlma(lm(log(crowdfunding$successful_rate)~log(crowdfunding$GiniCoeff))))

Call:
lm(formula = log(crowdfunding$successful_rate) ~ log(crowdfunding$GiniCoeff))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.89272 -0.13415  0.03076  0.16062  0.50236 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)   
(Intercept)                   1.3738     0.7782   1.765  0.08385 . 
log(crowdfunding$GiniCoeff)   3.0507     0.9784   3.118  0.00307 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.2697 on 48 degrees of freedom
Multiple R-squared:  0.1684,    Adjusted R-squared:  0.1511 
F-statistic: 9.722 on 1 and 48 DF,  p-value: 0.003074


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = lm(log(crowdfunding$successful_rate) ~ log(crowdfunding$GiniCoeff))) 

                     Value   p-value                   Decision
Global Stat        28.9877 7.862e-06 Assumptions NOT satisfied!
Skewness           11.4306 7.225e-04 Assumptions NOT satisfied!
Kurtosis           12.4173 4.254e-04 Assumptions NOT satisfied!
Link Function       0.5972 4.396e-01    Assumptions acceptable.
Heteroscedasticity  4.5427 3.306e-02 Assumptions NOT satisfied!
summary(gvlma(lm(crowdfunding$successful_rate~crowdfunding$GiniCoeff)))

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$GiniCoeff)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.197648 -0.054730 -0.003818  0.055170  0.201729 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)   
(Intercept)             -0.5417     0.2993  -1.810  0.07655 . 
crowdfunding$GiniCoeff   2.0008     0.6613   3.026  0.00398 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08254 on 48 degrees of freedom
Multiple R-squared:  0.1602,    Adjusted R-squared:  0.1427 
F-statistic: 9.154 on 1 and 48 DF,  p-value: 0.003981


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = lm(crowdfunding$successful_rate ~ crowdfunding$GiniCoeff)) 

                     Value p-value                Decision
Global Stat        2.77666  0.5959 Assumptions acceptable.
Skewness           0.03904  0.8434 Assumptions acceptable.
Kurtosis           0.03367  0.8544 Assumptions acceptable.
Link Function      0.11971  0.7294 Assumptions acceptable.
Heteroscedasticity 2.58424  0.1079 Assumptions acceptable.
summary(lm(crowdfunding$successful_rate~crowdfunding$GiniCoeff))

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$GiniCoeff)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.197648 -0.054730 -0.003818  0.055170  0.201729 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)   
(Intercept)             -0.5417     0.2993  -1.810  0.07655 . 
crowdfunding$GiniCoeff   2.0008     0.6613   3.026  0.00398 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08254 on 48 degrees of freedom
Multiple R-squared:  0.1602,    Adjusted R-squared:  0.1427 
F-statistic: 9.154 on 1 and 48 DF,  p-value: 0.003981
par(mfrow=c(2,2))

plot(lm(log(crowdfunding$successful_rate)~log(crowdfunding$pAdDeg)))

plot(lm(crowdfunding$successful_rate~crowdfunding$pAdDeg))

plot(lm(crowdfunding$successful_rate~crowdfunding$GiniCoeff))

SR2Gini<-lm(crowdfunding$successful_rate~crowdfunding$GiniCoeff)
cor.test(crowdfunding$successful_rate,crowdfunding$GiniCoeff,method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  crowdfunding$successful_rate and crowdfunding$GiniCoeff
S = 13615, p-value = 0.01378
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.3462269 
summary(lm(SR2Gini$residuals~crowdfunding$pAdDeg))

Call:
lm(formula = SR2Gini$residuals ~ crowdfunding$pAdDeg)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.187967 -0.048021 -0.005676  0.052160  0.167582 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)  
(Intercept)         -0.09539    0.04578  -2.083   0.0426 *
crowdfunding$pAdDeg  0.97396    0.45341   2.148   0.0368 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.07884 on 48 degrees of freedom
Multiple R-squared:  0.0877,    Adjusted R-squared:  0.06869 
F-statistic: 4.614 on 1 and 48 DF,  p-value: 0.03678
cor.test(crowdfunding$successful_rate,crowdfunding$pAdDeg,method = "spearman")
Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  crowdfunding$successful_rate and crowdfunding$pAdDeg
S = 12634, p-value = 0.004719
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.3933076 
summary(gvlma(lm(SR2Gini$residuals~crowdfunding$pAdDeg)))

Call:
lm(formula = SR2Gini$residuals ~ crowdfunding$pAdDeg)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.187967 -0.048021 -0.005676  0.052160  0.167582 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)  
(Intercept)         -0.09539    0.04578  -2.083   0.0426 *
crowdfunding$pAdDeg  0.97396    0.45341   2.148   0.0368 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.07884 on 48 degrees of freedom
Multiple R-squared:  0.0877,    Adjusted R-squared:  0.06869 
F-statistic: 4.614 on 1 and 48 DF,  p-value: 0.03678


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = lm(SR2Gini$residuals ~ crowdfunding$pAdDeg)) 

                     Value p-value                Decision
Global Stat        2.96167  0.5643 Assumptions acceptable.
Skewness           0.38039  0.5374 Assumptions acceptable.
Kurtosis           0.01984  0.8880 Assumptions acceptable.
Link Function      1.96967  0.1605 Assumptions acceptable.
Heteroscedasticity 0.59177  0.4417 Assumptions acceptable.
SR2ad<-lm(crowdfunding$successful_rate~crowdfunding$pAdDeg)
cor.test(crowdfunding$successful_rate,crowdfunding$pAdDeg)

    Pearson's product-moment correlation

data:  crowdfunding$successful_rate and crowdfunding$pAdDeg
t = 2.9415, df = 48, p-value = 0.005015
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.1261889 0.6035073
sample estimates:
      cor 
0.3908097 
summary(lm(SR2ad$residuals~crowdfunding$GiniCoeff))

Call:
lm(formula = SR2ad$residuals ~ crowdfunding$GiniCoeff)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.195484 -0.051186  0.004758  0.054168  0.147777 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)  
(Intercept)             -0.6411     0.2860  -2.242   0.0296 *
crowdfunding$GiniCoeff   1.4178     0.6319   2.244   0.0295 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.07887 on 48 degrees of freedom
Multiple R-squared:  0.09492,   Adjusted R-squared:  0.07606 
F-statistic: 5.034 on 1 and 48 DF,  p-value: 0.02951
summary(gvlma(lm(SR2ad$residuals~crowdfunding$GiniCoeff)))

Call:
lm(formula = SR2ad$residuals ~ crowdfunding$GiniCoeff)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.195484 -0.051186  0.004758  0.054168  0.147777 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)  
(Intercept)             -0.6411     0.2860  -2.242   0.0296 *
crowdfunding$GiniCoeff   1.4178     0.6319   2.244   0.0295 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.07887 on 48 degrees of freedom
Multiple R-squared:  0.09492,   Adjusted R-squared:  0.07606 
F-statistic: 5.034 on 1 and 48 DF,  p-value: 0.02951


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = lm(SR2ad$residuals ~ crowdfunding$GiniCoeff)) 

                     Value p-value                Decision
Global Stat        2.34938  0.6718 Assumptions acceptable.
Skewness           1.05702  0.3039 Assumptions acceptable.
Kurtosis           0.04151  0.8386 Assumptions acceptable.
Link Function      0.83145  0.3619 Assumptions acceptable.
Heteroscedasticity 0.41941  0.5172 Assumptions acceptable.
summary(gvlma(lm(crowdfunding$successful_rate~crowdfunding$GiniCoeff+crowdfunding$pAdDeg)))

Call:
lm(formula = crowdfunding$successful_rate ~ crowdfunding$GiniCoeff + 
    crowdfunding$pAdDeg)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.195999 -0.049936 -0.001397  0.053631  0.160600 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)  
(Intercept)             -0.4454     0.2907  -1.532   0.1322  
crowdfunding$GiniCoeff   1.5563     0.6656   2.338   0.0237 *
crowdfunding$pAdDeg      1.0692     0.4778   2.238   0.0300 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.0793 on 47 degrees of freedom
Multiple R-squared:  0.241, Adjusted R-squared:  0.2087 
F-statistic: 7.462 on 2 and 47 DF,  p-value: 0.001533


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = lm(crowdfunding$successful_rate ~ crowdfunding$GiniCoeff +      crowdfunding$pAdDeg)) 

                      Value p-value                Decision
Global Stat        4.746089 0.31436 Assumptions acceptable.
Skewness           0.710171 0.39939 Assumptions acceptable.
Kurtosis           0.002151 0.96300 Assumptions acceptable.
Link Function      3.157228 0.07559 Assumptions acceptable.
Heteroscedasticity 0.876539 0.34915 Assumptions acceptable.
require(car)
#SR2Gini---------
qqPlot(SR2Gini,labels=row.names(crowdfunding),id.method="identify",simulate=TRUE,main="Q-Q Plot")
influencePlot(SR2Gini,labels=row.names(crowdfunding),id.method="identify",main="Influence Plot", sub="Circle size if proportional to Cook's distance")  
#SR2all----------
SR2GiniAdedc<-lm(successful_rate~GiniCoeff+pAdDeg,data=crowdfunding)
qqPlot(SR2GiniAdedc,labels=row.names(crowdfunding),id.method="identify",simulate=TRUE,main="Q-Q Plot")
influencePlot(SR2GiniAdedc,labels=row.names(crowdfunding),id.method="identify",main="Influence Plot", sub="Circle size if proportional to Cook's distance")  

#
anova(SR2GiniAdedc)
Analysis of Variance Table

Response: successful_rate
          Df   Sum Sq  Mean Sq F value   Pr(>F)   
GiniCoeff  1 0.062361 0.062361  9.9178 0.002844 **
pAdDeg     1 0.031482 0.031482  5.0068 0.030026 * 
Residuals 47 0.295525 0.006288                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(gvlma(lm(successful_rate~NPov000s,data=crowdfunding)))

Call:
lm(formula = successful_rate ~ NPov000s, data = crowdfunding)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.230673 -0.041789 -0.001671  0.045678  0.193621 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3.541e-01  1.642e-02  21.560   <2e-16 ***
NPov000s    9.537e-06  1.113e-05   0.857    0.396    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08938 on 48 degrees of freedom
Multiple R-squared:  0.01507,   Adjusted R-squared:  -0.005451 
F-statistic: 0.7343 on 1 and 48 DF,  p-value: 0.3957


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = lm(successful_rate ~ NPov000s, data = crowdfunding)) 

                    Value p-value                   Decision
Global Stat        6.8904 0.14179    Assumptions acceptable.
Skewness           0.5449 0.46041    Assumptions acceptable.
Kurtosis           0.5976 0.43948    Assumptions acceptable.
Link Function      0.9871 0.32046    Assumptions acceptable.
Heteroscedasticity 4.7608 0.02911 Assumptions NOT satisfied!
SR2ginieduclevel<-lm(successful_rate~pAdDeg+PovRate1,data=crowdfunding)
summary(gvlma(SR2ginieduclevel))

Call:
lm(formula = successful_rate ~ pAdDeg + PovRate1, data = crowdfunding)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.180982 -0.056105 -0.000637  0.054745  0.142832 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.06244    0.09334  -0.669  0.50678    
pAdDeg       2.24363    0.49262   4.554 3.73e-05 ***
PovRate1     1.39012    0.39874   3.486  0.00107 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.07468 on 47 degrees of freedom
Multiple R-squared:  0.3268,    Adjusted R-squared:  0.2982 
F-statistic: 11.41 on 2 and 47 DF,  p-value: 9.144e-05


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = SR2ginieduclevel) 

                    Value p-value                Decision
Global Stat        2.4121  0.6604 Assumptions acceptable.
Skewness           0.2126  0.6448 Assumptions acceptable.
Kurtosis           0.3593  0.5489 Assumptions acceptable.
Link Function      1.6219  0.2028 Assumptions acceptable.
Heteroscedasticity 0.2184  0.6403 Assumptions acceptable.
logSR2ginieduclevel<-lm(log(successful_rate)~log(pAdDeg)+log(PovRate1),data=crowdfunding)
summary(gvlma(logSR2ginieduclevel))

Call:
lm(formula = log(successful_rate) ~ log(pAdDeg) + log(PovRate1), 
    data = crowdfunding)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.85136 -0.12078  0.03723  0.16421  0.32414 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)     2.1251     0.6603   3.218 0.002339 ** 
log(pAdDeg)     0.7485     0.1675   4.468 4.96e-05 ***
log(PovRate1)   0.7320     0.1915   3.823 0.000387 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.2441 on 47 degrees of freedom
Multiple R-squared:  0.3331,    Adjusted R-squared:  0.3047 
F-statistic: 11.74 on 2 and 47 DF,  p-value: 7.329e-05


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = logSR2ginieduclevel) 

                    Value   p-value                   Decision
Global Stat        26.409 2.616e-05 Assumptions NOT satisfied!
Skewness           13.302 2.652e-04 Assumptions NOT satisfied!
Kurtosis           10.646 1.103e-03 Assumptions NOT satisfied!
Link Function       1.454 2.278e-01    Assumptions acceptable.
Heteroscedasticity  1.007 3.155e-01    Assumptions acceptable.
test1<-lm(pAdDeg~PovRate1,data=crowdfunding)
test2<-lm(PovRate1~pAdDeg,data=crowdfunding)
plot(SR2ginieduclevel)

anova(SR2ginieduclevel)
Analysis of Variance Table

Response: successful_rate
          Df   Sum Sq  Mean Sq F value   Pr(>F)   
pAdDeg     1 0.059469 0.059469  10.663 0.002043 **
PovRate1   1 0.067783 0.067783  12.154 0.001073 **
Residuals 47 0.262116 0.005577                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#plot(crowdfunding$education_leverage,crowdfunding$successful_rate)
#boxplot(crowdfunding$successful_rate[crowdfunding$education_leverage==1],crowdfunding$successful_rate[crowdfunding$education_leverage==6])
#vif:Variance Inflation Factor----------
vif(SR2GiniAdedc)
GiniCoeff    pAdDeg 
 1.097739  1.097739 
vif(SR2ginieduclevel)
  pAdDeg PovRate1 
1.315553 1.315553 
sqrt(vif(SR2GiniAdedc))>2
GiniCoeff    pAdDeg 
    FALSE     FALSE 
sqrt(vif(SR2ginieduclevel))>2
  pAdDeg PovRate1 
   FALSE    FALSE 
#PCA---------
prcomp(~pAdDeg+PovRate1,data=crowdfunding)
Standard deviations:
[1] 0.03444520 0.01929402

Rotation:
                PC1        PC2
pAdDeg   -0.5482532 -0.8363124
PovRate1  0.8363124 -0.5482532
require(moments)
kurtosis(crowdfunding$successful_rate)
[1] 3.630147
skewness(crowdfunding$successful_rate)
[1] -0.3574304
summary(gvlma(lm(crowdfunding$successful_rate~test1$residuals)))

Call:
lm(formula = crowdfunding$successful_rate ~ test1$residuals)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.193509 -0.054867  0.003501  0.055271  0.137047 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)      0.36306    0.01068  33.999  < 2e-16 ***
test1$residuals  2.24363    0.49810   4.504 4.26e-05 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.07551 on 48 degrees of freedom
Multiple R-squared:  0.2971,    Adjusted R-squared:  0.2825 
F-statistic: 20.29 on 1 and 48 DF,  p-value: 4.259e-05


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = lm(crowdfunding$successful_rate ~ test1$residuals)) 

                    Value p-value                Decision
Global Stat        4.3345 0.36263 Assumptions acceptable.
Skewness           0.8744 0.34974 Assumptions acceptable.
Kurtosis           0.1683 0.68162 Assumptions acceptable.
Link Function      3.0237 0.08206 Assumptions acceptable.
Heteroscedasticity 0.2681 0.60463 Assumptions acceptable.
summary(gvlma(lm(crowdfunding$successful_rate~test2$residuals)))

Call:
lm(formula = crowdfunding$successful_rate ~ test2$residuals)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.194923 -0.055056 -0.003674  0.055637  0.192004 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)      0.36306    0.01158  31.365  < 2e-16 ***
test2$residuals  1.39012    0.43704   3.181  0.00257 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08185 on 48 degrees of freedom
Multiple R-squared:  0.1741,    Adjusted R-squared:  0.1569 
F-statistic: 10.12 on 1 and 48 DF,  p-value: 0.002574


ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = lm(crowdfunding$successful_rate ~ test2$residuals)) 

                      Value p-value                Decision
Global Stat        5.248197 0.26277 Assumptions acceptable.
Skewness           0.002307 0.96169 Assumptions acceptable.
Kurtosis           0.017605 0.89444 Assumptions acceptable.
Link Function      3.162908 0.07533 Assumptions acceptable.
Heteroscedasticity 2.065378 0.15068 Assumptions acceptable.
LS0tCnRpdGxlOiAiQXNzaWdubWVudCIKYXV0aG9yOiAic24wd2ZyZWUiCmRhdGU6ICIxMi8xNi8yMDE2IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKLS0tCgoKIyMgSW1wb3J0IERhdGEKYGBge3IgaW1wb3J0IGRhdGV9CmNyb3dkZnVuZGluZzwtcmVhZC5jc3YoICJmb3Jxcm0uY3N2IiAsaGVhZGVyPTEpCmNyb3dkZnVuZGluZ19yZWdpb248LXJlYWQuY3N2KCAiZm9ycXJtLmNzdiIgLGhlYWRlcj0xKQpoZWFkKGNyb3dkZnVuZGluZykKbGlicmFyeShsbXRlc3QpCgpyb3duYW1lcyhjcm93ZGZ1bmRpbmcpPC1jcm93ZGZ1bmRpbmckU3RhdGUKc2U8LWNyb3dkZnVuZGluZ1tjKCJHaW5pQ29lZmYiLCJwQWREZWciLCJzdWNjZXNzZnVsX3JhdGUiKV0Kc2UKI2NvcgpgYGAKCiMjIEZpbmQgVG9waWNzCiMjIyAxLkdlb2dyYXBoeSBpbmZvcm1hdGlvbgoKMS4gR2VvZ3JhcGh5IGluZm9ybWF0aW9uOmZvdW5kIHRoZSBzaWduaWZpY2FsbHkgZGlmZmVyZW50IGJ5IHN0YXRlL2J5IHJlZ2lvbgogICsgQW1vdW50CiAgKyBzdWNjZXNzZnVsbCByYXRlCiAgd2l0aGluIGdyYXBoeS9wbG90CiAgCiMjIyAyLkZhY3RvcnMgYW5hbHlzaXM6CiAgCjIuIGZhY3RvcnM6c3R1ZHlpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFN1Y2Nlc3NmdWwgUmF0ZSBhbmQgb3RoZXIgZmFjdG9yczoKICArIEhpZ2hlciBFZHVjdGlvbjpwQWREZWc7CiAgKyBHaW5pY29lZmYKICAjIGF2ZXJhZ2VfcGxlZGdlZF9hbW91bnRfb2ZfR3JhbmQuVG90YWwjCmBgYHtyIHBpZX0KcGllKHRhYmxlKGNyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uKSkKCmBgYAoKCiMjIyAzLlRvdGFsIHJlZ3Jlc3Npb24KYGBge3IgcmVncmVzc2lvbn0KCnN1Y2Nlc3NmdWxfcmF0ZTJHaW5pQ29lZmY8LWxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikjc2lnbmlmaWNhbnQ6MC4wMDM5OApzdW1tYXJ5KHN1Y2Nlc3NmdWxfcmF0ZTJHaW5pQ29lZmYpCgpzdWNjZXNzZnVsX3JhdGUyTlBvdjAwMHM8LWxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJE5Qb3YwMDBzKSMwLjIzMQpzdW1tYXJ5KHN1Y2Nlc3NmdWxfcmF0ZTJOUG92MDAwcykKCnN1bW1hcnkobG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckcEhpZ2gpKSNiYWQ6MC4yMzIwIApzdW1tYXJ5KGxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJHBCYXREZWcpKSNsb3c6MC4wNTUxMQoKc3VjY2Vzc2Z1bF9yYXRlMnBBZERlZzwtbG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckcEFkRGVnKSNzaWduaWZpY2FudDowLjAwNTAxCnN1bW1hcnkoc3VjY2Vzc2Z1bF9yYXRlMnBBZERlZykKCiNzdXBwbGVtZW50IHJlZ3Jlc3Npb24Kc3VtbWFyeShsbShjcm93ZGZ1bmRpbmckR2luaUNvZWZmfmNyb3dkZnVuZGluZyRwQWREZWcpKSNzaWduaWZpY2FudDowLjAzNTMKCgpzdW1tYXJ5KGxtKGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbH5jcm93ZGZ1bmRpbmckUG9wMjAxMCkpI3NpZ25pZmljYW50OjAuMDM1MwoKI3N1bW1hcnkobG0oc3VjY2Vzc2Z1bF9yYXRlMlBvdlJhdGUxJHJlc2lkdWFsc35jcm93ZGZ1bmRpbmckcEFkRGVnKSkjMC4wMDAzODgxCiNzdW1tYXJ5KGxtKHN1Y2Nlc3NmdWxfcmF0ZTJQb3ZSYXRlMSRyZXNpZHVhbHN+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikpIzAuMDI2NAoKc3VtbWFyeShsbShzdWNjZXNzZnVsX3JhdGUyR2luaUNvZWZmJHJlc2lkdWFsc35jcm93ZGZ1bmRpbmckcEFkRGVnKSkjcmVzaWR1YWxzIH4gQURkZWc6MC4wMzY4CiNzdW1tYXJ5KGxtKHN1Y2Nlc3NmdWxfcmF0ZTJHaW5pQ29lZmYkcmVzaWR1YWxzfmNyb3dkZnVuZGluZyRQb3ZSYXRlMSkpI3Jlc2lkdWFscyB+IFBvdlJhdGUxOjAuNzcxCgojc3VtbWFyeShsbShzdWNjZXNzZnVsX3JhdGUycEFkRGVnJHJlc2lkdWFsc35jcm93ZGZ1bmRpbmckUG92UmF0ZTEpKSMwLjAwNDUwNQpzdW1tYXJ5KGxtKHN1Y2Nlc3NmdWxfcmF0ZTJwQWREZWckcmVzaWR1YWxzfmNyb3dkZnVuZGluZyRHaW5pQ29lZmYpKSMwLjAyOTUKCgojc3VtbWFyeShsbShsb2coY3Jvd2RmdW5kaW5nJGF2ZXJhZ2VfcGxlZGdlZF9hbW91bnRfb2ZfR3JhbmQuVG90YWwpfmNyb3dkZnVuZGluZyRHaW5pQ29lZmYpKSMwLjAyMzU3CgoKYGBgCgojIyBHZW9ncmFwaHkgaW5mb3JtYXRpb24KCgoKIyMjIEdlb2dyYXBoeSBpbmZvcm1hdGlvbi1wcmVwcm9jZXNzOmttZWFuCmBgYHtyIGttZWFuc30KaGM8LWhjbHVzdChkaXN0KGNyb3dkZnVuZGluZyksbWV0aG9kID0gIndhcmQuRCIsIG1lbWJlcnMgPSBOVUxMKQpwbGNsdXN0KGhjKQpyZWN0LmhjbHVzdChoYyxrPTIpCgoKaGVhdG1hcChhcy5tYXRyaXgoZGlzdChjcm93ZGZ1bmRpbmcsbWV0aG9kPSAnZXVjbGlkZWFuJykpLGxhYlJvdyA9IEYsIGxhYkNvbCA9IEYpCnJlc3VsdDwtY3V0cmVlKGhjLGs9MikKcmVzdWx0LmNhdGVnb3J5PC1hcy5kYXRhLmZyYW1lKHJlc3VsdCkKY29sbmFtZXMocmVzdWx0LmNhdGVnb3J5KTwtYygiTURTX0NhdGVnb3J5IikKcmVzdWx0LmNhdGVnb3J5CnBpZShyZXN1bHQpCmJhcnBsb3QocmVzdWx0LGNvbCA9cmVzdWx0ICkKI3RhYmxlKHJlc3VsdCkKI3N1bW1hcnkocmVzdWx0KQpwbG90KHJlc3VsdCx0eXBlID0gInAiLGNvbD1yZXN1bHQseGxhYj0iU3RhdGUiLHhheHQ9Im4iLHlsYWI9Ik1EU19DYXRlZ29yeSIpCgoKbGlicmFyeShnZ3Bsb3QyKQptZHMyIDwtIC1jbWRzY2FsZShkaXN0KGNyb3dkZnVuZGluZykpCnBsb3QobWRzMiwgdHlwZT0ibiIsIGF4ZXM9RkFMU0UsIGFubj1GQUxTRSkKdGV4dChtZHMyLCBsYWJlbHM9cm93bmFtZXMobWRzMiksIHhwZCA9IE5BKQoKbWRzPC1jbWRzY2FsZShkaXN0KGNyb3dkZnVuZGluZyksaz0yLGVpZz1UKQp4ID0gbWRzJHBvaW50c1ssMV0KeSA9IG1kcyRwb2ludHNbLDJdCnA9Z2dwbG90KGRhdGEuZnJhbWUoeCx5KSxhZXMoeCx5KSkKcCtnZW9tX3BvaW50KHNpemU9NSAsIGFscGhhPTAuOCAsIGFlcyhjb2xvdXI9ZmFjdG9yKHJlc3VsdCkgKSkKCgogIApgYGAKCgoKYGBge3IgcmVncm91cH0KI3JlZ3JvdXAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNjcm93ZGZ1bmRpbmcuYmFja3VwPC1jcm93ZGZ1bmRpbmcKCnJlc3VsdC5jYXRlZ29yeVsiU3RhdGUiXTwtcm93Lm5hbWVzKHJlc3VsdC5jYXRlZ29yeSkKCiNjcm93ZGZ1bmRpbmc8LWNyb3dkZnVuZGluZ1tjKCJTdGF0ZSIsInN1Y2Nlc3NmdWxfcmF0ZSIsIlJlZ2lvbiIsImNvdW50X29mX0dyYW5kLlRvdGFsIiwiR2luaUNvZWZmIiwicEFkRGVnIiwicEhpZ2giLCJwQmF0RGVnIiwiUG9wMjAxMCIpXQojY3Jvd2RmdW5kaW5nJFBvcDIwMTA8LWxvZyhjcm93ZGZ1bmRpbmckUG9wMjAxMCkKI2Nyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbDwtbG9nKGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbCkKY3Jvd2RmdW5kaW5nPC1tZXJnZShjcm93ZGZ1bmRpbmcscmVzdWx0LmNhdGVnb3J5LGFsbC54PVRSVUUpCiNyb3cubmFtZXMoY3Jvd2RmdW5kaW5nKTwtY3Jvd2RmdW5kaW5nJFN0YXRlCgojR2luaUNvZWZmLS0tLS0tLQpwYXIobWZyb3c9YygxLDIpKQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJE1EU19DYXRlZ29yeT09MV1+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT0xXSkKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRNRFNfQ2F0ZWdvcnk9PTFdfmNyb3dkZnVuZGluZyRHaW5pQ29lZmZbY3Jvd2RmdW5kaW5nJE1EU19DYXRlZ29yeT09MV0pLHR5cGU9ImwiLGNvbD0icmVkIikKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT0yXX5jcm93ZGZ1bmRpbmckR2luaUNvZWZmW2Nyb3dkZnVuZGluZyRNRFNfQ2F0ZWdvcnk9PTJdKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJE1EU19DYXRlZ29yeT09Ml1+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT0yXSksdHlwZT0ibCIsY29sPSJyZWQiKQoKc3VtbWFyeShsbShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRNRFNfQ2F0ZWdvcnk9PTFdfmNyb3dkZnVuZGluZyRHaW5pQ29lZmZbY3Jvd2RmdW5kaW5nJE1EU19DYXRlZ29yeT09MV0pKQpzdW1tYXJ5KGxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJE1EU19DYXRlZ29yeT09Ml1+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT0yXSkpCgojcEFkRGVnLS0tLS0tLQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJE1EU19DYXRlZ29yeT09MV1+Y3Jvd2RmdW5kaW5nJHBBZERlZ1tjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT0xXSkKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRNRFNfQ2F0ZWdvcnk9PTFdfmNyb3dkZnVuZGluZyRwQWREZWdbY3Jvd2RmdW5kaW5nJE1EU19DYXRlZ29yeT09MV0pLHR5cGU9ImwiLGNvbD0icmVkIikKcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRNRFNfQ2F0ZWdvcnk9PTJdfmNyb3dkZnVuZGluZyRwQWREZWdbY3Jvd2RmdW5kaW5nJE1EU19DYXRlZ29yeT09Ml0pCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT0yXX5jcm93ZGZ1bmRpbmckcEFkRGVnW2Nyb3dkZnVuZGluZyRNRFNfQ2F0ZWdvcnk9PTJdKSx0eXBlPSJsIixjb2w9InJlZCIpCgpzdW1tYXJ5KGxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJE1EU19DYXRlZ29yeT09MV1+Y3Jvd2RmdW5kaW5nJHBBZERlZ1tjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT0xXSkpCnN1bW1hcnkobG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT0yXX5jcm93ZGZ1bmRpbmckcEFkRGVnW2Nyb3dkZnVuZGluZyRNRFNfQ2F0ZWdvcnk9PTJdKSkKCmBgYAoKCgoKCiMjIyBHZW9ncmFwaHkgSW5mb3JtYXRpb24tc2ltcGxlcGxvdApgYGB7ciBHZW9ncmFwaHkgSW5mb3JtYXRpb24tc2ltcGxlcGxvdH0KcGFyKG1mcm93PWMoMSwyKSApCgojY291bnRfb2ZfR3JhbmQuVG90YWwKcGxvdChjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWwsY29sPWNyb3dkZnVuZGluZyRSZWdpb24sIG1haW49IkNvdW50IG9mIFByb2plY3RzIFBsb3QiLHlsYWI9IkNvdW50IG9mIFByb2plY3RzIix4YXh0PSJuIix4bGFiPSJTdGF0ZSIpCiNheGlzKHNpZGU9MSxhdD1jKDEsMiwzLDQsNSw2LDcsOCksbGFiZWxzPWMoY3Jvd2RmdW5kaW5nJFN0YXRlKSkKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gbGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pLGNleCA9IDAuOCwgcGNoID0gMSxjb2w9MTo0KQoKCgojc3VjY2Vzc2Z1bF9yYXRlCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjb2w9Y3Jvd2RmdW5kaW5nJFJlZ2lvbiwgbWFpbj0iU3VjY2Vzc2Z1bCBSYXRlIFBsb3QiLHlsYWI9IlN1Y2Nlc3NmdWwgUmF0ZSIseGF4dD0ibiIseGxhYj0iU3RhdGUiKQojYXhpcyhzaWRlPTEsYXQ9YygxLDIsMyw0LDUsNiw3LDgpLGxhYmVscz1jKGNyb3dkZnVuZGluZyRTdGF0ZSkpCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kID0gbGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pLGNleCA9IDAuOCwgcGNoID0gMSxjb2w9MTo0KQpgYGAKCiMjIyBHZW9ncmFwaHkgaW5mb3JtYXRpb24tYm94cGxvdApgYGB7ciBHZW9ncmFwaHkgaW5mb3JtYXRpb24tYm94cGxvdH0KcGFyKG1mcm93PWMoMSwzKSkKI0JveHBsb3QgZm9yIHN1Y2Nlc3NmdWxfcmF0ZSBhbmQgY291bnRfb2ZfR3JhbmQuVG90YWwKI2NvdW50X29mX0dyYW5kLlRvdGFsCmJveHBsb3QoY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0sCiAgICAgICAgY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXSwKICAgICAgICBjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0sCiAgICAgICAgY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0sCiAgICAgICAgbmFtZXM9bGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pLG1haW49IkNvdW50IG9mIFByb2plY3RzIEJveFBsb3QgYnkgUmVnaW9uIix2YXJ3aWR0aD1UUlVFKQoKcmVxdWlyZShtb21lbnRzKQpza2V3bmVzcyhjcm93ZGZ1bmRpbmdfcmVnaW9uJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uPT0iTWlkd2VzdCJdKQpza2V3bmVzcyhjcm93ZGZ1bmRpbmdfcmVnaW9uJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uPT0iTm9ydGhlYXN0Il0pCnNrZXduZXNzKGNyb3dkZnVuZGluZ19yZWdpb24kY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nX3JlZ2lvbiRSZWdpb249PSJTb3V0aCJdKQpza2V3bmVzcyhjcm93ZGZ1bmRpbmdfcmVnaW9uJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uPT0iV2VzdCJdKQoKa3VydG9zaXMoY3Jvd2RmdW5kaW5nX3JlZ2lvbiRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmdfcmVnaW9uJFJlZ2lvbj09Ik1pZHdlc3QiXSkKa3VydG9zaXMoY3Jvd2RmdW5kaW5nX3JlZ2lvbiRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmdfcmVnaW9uJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKQprdXJ0b3Npcyhjcm93ZGZ1bmRpbmdfcmVnaW9uJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uPT0iU291dGgiXSkKa3VydG9zaXMoY3Jvd2RmdW5kaW5nX3JlZ2lvbiRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmdfcmVnaW9uJFJlZ2lvbj09Ildlc3QiXSkKCgpib3hwbG90KGxvZyhjcm93ZGZ1bmRpbmdfcmVnaW9uJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uPT0iTWlkd2VzdCJdKSwKICAgICAgICBsb2coY3Jvd2RmdW5kaW5nX3JlZ2lvbiRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmdfcmVnaW9uJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKSwKICAgICAgICBsb2coY3Jvd2RmdW5kaW5nX3JlZ2lvbiRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmdfcmVnaW9uJFJlZ2lvbj09IlNvdXRoIl0pLAogICAgICAgIGxvZyhjcm93ZGZ1bmRpbmdfcmVnaW9uJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uPT0iV2VzdCJdKSwKICAgICAgICBuYW1lcz1sZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbiksbWFpbj0iTG9nIENvdW50IG9mIFByb2plY3RzIEJveFBsb3QgYnkgUmVnaW9uIikKCgoKI3N1Y2Nlc3NmdWxfcmF0ZQpib3hwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSwKICAgICAgICBjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXSwKICAgICAgICBjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdLAogICAgICAgIGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSwKICAgICAgICBuYW1lcz1sZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbiksbWFpbj0iU3VjY2Vzc2Z1bCBSYXRlIEJveFBsb3QgYnkgUmVnaW9uIikKCnNrZXduZXNzKGNyb3dkZnVuZGluZ19yZWdpb24kc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uPT0iTWlkd2VzdCJdKQpza2V3bmVzcyhjcm93ZGZ1bmRpbmdfcmVnaW9uJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmdfcmVnaW9uJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKQpza2V3bmVzcyhjcm93ZGZ1bmRpbmdfcmVnaW9uJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmdfcmVnaW9uJFJlZ2lvbj09IlNvdXRoIl0pCnNrZXduZXNzKGNyb3dkZnVuZGluZ19yZWdpb24kc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uPT0iV2VzdCJdKQoKCmt1cnRvc2lzKGNyb3dkZnVuZGluZ19yZWdpb24kc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uPT0iTWlkd2VzdCJdKQprdXJ0b3Npcyhjcm93ZGZ1bmRpbmdfcmVnaW9uJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmdfcmVnaW9uJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKQprdXJ0b3Npcyhjcm93ZGZ1bmRpbmdfcmVnaW9uJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmdfcmVnaW9uJFJlZ2lvbj09IlNvdXRoIl0pCmt1cnRvc2lzKGNyb3dkZnVuZGluZ19yZWdpb24kc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZ19yZWdpb24kUmVnaW9uPT0iV2VzdCJdKQoKCnBhcihtZnJvdz1jKDIsNCkpCiNjb3VudF9vZl9HcmFuZC5Ub3RhbApxcW5vcm0oY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0seGxhYj0iTWlkd2VzdCIseGF4dD0ibiIsY29sPSJibGFjayIsbWFpbj0iQ291bnQgb2YgUHJvamVjdHMtTm9ybSBRLVEgUGxvdCIpCnFxbGluZShjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSkKCnFxbm9ybShjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdLHhsYWI9Ik5vcnRoZWFzdCIseGF4dD0ibiIsY29sPSJyZWQiLG1haW49IkNvdW50IG9mIFByb2plY3RzZS1Ob3JtIFEtUSBQbG90IikKcXFsaW5lKGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0pCgpxcW5vcm0oY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdLHhsYWI9IlNvdXRoIixjb2w9ImdyZWVuIix4YXh0PSJuIixtYWluPSJDb3VudCBvZiBQcm9qZWN0cy1Ob3JtIFEtUSBQbG90IikKcXFsaW5lKGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXSkKCnFxbm9ybShjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSx4bGFiPSJXZXN0Iixjb2w9ImJsdWUiLHhheHQ9Im4iLG1haW49IkNvdW50IG9mIFByb2plY3RzLU5vcm0gUS1RIFBsb3QiKQpxcWxpbmUoY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0pCgoKCiNzdWNjZXNzZnVsX3JhdGUKcXFub3JtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSx4bGFiPSJNaWR3ZXN0Iixjb2w9ImJsYWNrIix4YXh0PSJuIixtYWluPSJTdWNjZXNzZnVsIFJhdGUtTm9ybSBRLVEgUGxvdCIpCnFxbGluZShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0pCgpxcW5vcm0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0seGxhYj0iTm9ydGhlYXN0Iixjb2w9InJlZCIseGF4dD0ibiIsbWFpbj0iU3VjY2Vzc2Z1bCBSYXRlLU5vcm0gUS1RIFBsb3QiKQpxcWxpbmUoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0pCgpxcW5vcm0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXSx4bGFiPSJTb3V0aCIsY29sPSJncmVlbiIseGF4dD0ibiIsbWFpbj0iU3VjY2Vzc2Z1bCBSYXRlLU5vcm0gUS1RIFBsb3QiKQpxcWxpbmUoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXSkKCnFxbm9ybShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0seGxhYj0iV2VzdCIsY29sPSJibHVlIix4YXh0PSJuIixtYWluPSJTdWNjZXNzZnVsIFJhdGUtTm9ybSBRLVEgUGxvdCIpCnFxbGluZShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0pCgprdXJ0b3Npcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0pCmt1cnRvc2lzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKSAgICAgIAprdXJ0b3Npcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdKSAgICAgIAprdXJ0b3Npcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0pICAgICAgCgoKYGBgCmBgYHtyfQpwYXIobWZyb3c9YygxLDMpKQpxcW5vcm0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSwgbWFpbiA9IlN1Y2Nlc3NmdWwgcmF0ZTpRLVEgbm9ybSIsY29sPSJyZWQiKQpxcWxpbmUoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSkKcXFub3JtKGNyb3dkZnVuZGluZyRHaW5pQ29lZmYsIG1haW4gPSJHaW5pQ29lZmY6US1RIG5vcm0iLGNvbD0iYmx1ZSIpCnFxbGluZShjcm93ZGZ1bmRpbmckR2luaUNvZWZmKQpxcW5vcm0oY3Jvd2RmdW5kaW5nJHBBZERlZywgbWFpbiA9InBBZERlZzpRLVEgbm9ybSIsY29sPSJncmVlbiIpCnFxbGluZShjcm93ZGZ1bmRpbmckcEFkRGVnKQoKY29yLnRlc3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjcm93ZGZ1bmRpbmckR2luaUNvZWZmKQpjb3IudGVzdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlLGNyb3dkZnVuZGluZyRwQWREZWcsbWV0aG9kPSJzcGVhcm1hbiIpCgpgYGAKCgoKCiMjIyBHZW9ncmFwaHkgaW5mb3JtYXRpb246ZmFjdG9ycwpgYGB7cn0KYm94cGxvdChjcm93ZGZ1bmRpbmckR2luaUNvZWZmW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0sY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0sY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXSxjcm93ZGZ1bmRpbmckR2luaUNvZWZmW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0sbmFtZXM9bGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pLG1haW49IkdpbmlDb2VmZiBCb3hQbG90IGJ5IFJlZ2lvbiIsdmFyd2lkdGg9VFJVRSkKCmJveHBsb3QoY3Jvd2RmdW5kaW5nJHBBZERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdLGNyb3dkZnVuZGluZyRwQWREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdLGNyb3dkZnVuZGluZyRwQWREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0sY3Jvd2RmdW5kaW5nJHBBZERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdLG5hbWVzPWxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSxtYWluPSJwQWREZWcgQm94UGxvdCBieSBSZWdpb24iLHZhcndpZHRoPVRSVUUpCgoKc3VtbWFyeShsbShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il1+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdKSkKcGFyKG1mcm93PWMoMSw0KSkKI0dpbmlDb2VmZi0tLS0tLS0tLQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXX5jcm93ZGZ1bmRpbmckR2luaUNvZWZmW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0seGxhYj0iR2luaUNvZWZmIGluIE1pZHdlc3QiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBNaWR3ZXN0IikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il1+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdfmNyb3dkZnVuZGluZyRHaW5pQ29lZmZbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSx4bGFiPSJHaW5pQ29lZmYgaW4gV2VzdCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIFdlc3QiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXX5jcm93ZGZ1bmRpbmckR2luaUNvZWZmW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0pLGNvbD0icmVkIix0eXBlPSJsIikKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXX5jcm93ZGZ1bmRpbmckR2luaUNvZWZmW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdLHhsYWI9IkdpbmlDb2VmZiBpbiBTb3V0aCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIFNvdXRoIikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdfmNyb3dkZnVuZGluZyRHaW5pQ29lZmZbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0pLGNvbD0icmVkIix0eXBlPSJsIikKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il1+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0seGxhYj0iR2luaUNvZWZmIGluIE5vcnRoZWFzdCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIE5vcnRoZWFzdCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il1+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0pLGNvbD0icmVkIix0eXBlPSJsIikKCgojcEFkRGVnLS0tLS0tLS0tLS0KcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il1+Y3Jvd2RmdW5kaW5nJHBBZERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdLHhsYWI9InBBZERlZyBpbiBNaWR3ZXN0Iix5bGFiPSJTdWNjZXNzZnVsIHJhdGUgaW4gTWlkd2VzdCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdfmNyb3dkZnVuZGluZyRwQWREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSksY29sPSJyZWQiLHR5cGU9ImwiKQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXX5jcm93ZGZ1bmRpbmckcEFkRGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0seGxhYj0icEFkRGVnIGluIFdlc3QiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBXZXN0IikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il1+Y3Jvd2RmdW5kaW5nJHBBZERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCgpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl1+Y3Jvd2RmdW5kaW5nJHBBZERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXSx4bGFiPSJwQWREZWcgaW4gU291dGgiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBTb3V0aCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXX5jcm93ZGZ1bmRpbmckcEFkRGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCgpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdfmNyb3dkZnVuZGluZyRwQWREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdLHhsYWI9InBBZERlZyBpbiBOb3J0aGVhc3QiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBOb3J0aGVhc3QiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdfmNyb3dkZnVuZGluZyRwQWREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCgojcEJhdERlZy0tLS0tLS0tLS0tCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdfmNyb3dkZnVuZGluZyRwQmF0RGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0seGxhYj0icEJhdERlZyBpbiBNaWR3ZXN0Iix5bGFiPSJTdWNjZXNzZnVsIHJhdGUgaW4gTWlkd2VzdCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdfmNyb3dkZnVuZGluZyRwQmF0RGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0pLGNvbD0icmVkIix0eXBlPSJsIikKcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il1+Y3Jvd2RmdW5kaW5nJHBCYXREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSx4bGFiPSJwQmF0RGVnIGluIFdlc3QiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBXZXN0IikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il1+Y3Jvd2RmdW5kaW5nJHBCYXREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSksY29sPSJyZWQiLHR5cGU9ImwiKQoKcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdfmNyb3dkZnVuZGluZyRwQmF0RGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdLHhsYWI9InBCYXREZWcgaW4gU291dGgiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBTb3V0aCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXX5jcm93ZGZ1bmRpbmckcEJhdERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXSksY29sPSJyZWQiLHR5cGU9ImwiKQoKcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXX5jcm93ZGZ1bmRpbmckcEJhdERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0seGxhYj0icEJhdERlZyBpbiBOb3J0aGVhc3QiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBOb3J0aGVhc3QiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdfmNyb3dkZnVuZGluZyRwQmF0RGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXSksY29sPSJyZWQiLHR5cGU9ImwiKQoKI3BIaWdoLS0tLS0tLS0tLS0KcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il1+Y3Jvd2RmdW5kaW5nJHBIaWdoW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0seGxhYj0icEhpZ2ggaW4gTWlkd2VzdCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIE1pZHdlc3QiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXX5jcm93ZGZ1bmRpbmckcEhpZ2hbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSksY29sPSJyZWQiLHR5cGU9ImwiKQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXX5jcm93ZGZ1bmRpbmckcEhpZ2hbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSx4bGFiPSJwSGlnaCBpbiBXZXN0Iix5bGFiPSJTdWNjZXNzZnVsIHJhdGUgaW4gV2VzdCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdfmNyb3dkZnVuZGluZyRwSGlnaFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCgpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl1+Y3Jvd2RmdW5kaW5nJHBIaWdoW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdLHhsYWI9InBIaWdoIGluIFNvdXRoIix5bGFiPSJTdWNjZXNzZnVsIHJhdGUgaW4gU291dGgiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl1+Y3Jvd2RmdW5kaW5nJHBIaWdoW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCgpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdfmNyb3dkZnVuZGluZyRwSGlnaFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0seGxhYj0icEhpZ2ggaW4gTm9ydGhlYXN0Iix5bGFiPSJTdWNjZXNzZnVsIHJhdGUgaW4gTm9ydGhlYXN0IikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXX5jcm93ZGZ1bmRpbmckcEhpZ2hbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCgpgYGAKCmBgYHtyfQpwYXIobWZyb3c9YygxLDQpKQojR2luaUNvZWZmLS0tLS0tLS0tCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdfmNyb3dkZnVuZGluZyRHaW5pQ29lZmZbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSx4bGFiPSJHaW5pQ29lZmYgaW4gTWlkd2VzdCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIE1pZHdlc3QiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXX5jcm93ZGZ1bmRpbmckR2luaUNvZWZmW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0pLGNvbD0icmVkIix0eXBlPSJsIikKcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il1+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdLHhsYWI9IkdpbmlDb2VmZiBpbiBXZXN0Iix5bGFiPSJTdWNjZXNzZnVsIHJhdGUgaW4gV2VzdCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdfmNyb3dkZnVuZGluZyRHaW5pQ29lZmZbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSksY29sPSJyZWQiLHR5cGU9ImwiKQoKcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdfmNyb3dkZnVuZGluZyRHaW5pQ29lZmZbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0seGxhYj0iR2luaUNvZWZmIGluIFNvdXRoIix5bGFiPSJTdWNjZXNzZnVsIHJhdGUgaW4gU291dGgiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl1+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXSksY29sPSJyZWQiLHR5cGU9ImwiKQoKcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXX5jcm93ZGZ1bmRpbmckR2luaUNvZWZmW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXSx4bGFiPSJHaW5pQ29lZmYgaW4gTm9ydGhlYXN0Iix5bGFiPSJTdWNjZXNzZnVsIHJhdGUgaW4gTm9ydGhlYXN0IikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXX5jcm93ZGZ1bmRpbmckR2luaUNvZWZmW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXSksY29sPSJyZWQiLHR5cGU9ImwiKQoKCiNwQWREZWctLS0tLS0tLS0tLQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXX5jcm93ZGZ1bmRpbmckcEFkRGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0seGxhYj0icEFkRGVnIGluIE1pZHdlc3QiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBNaWR3ZXN0IikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il1+Y3Jvd2RmdW5kaW5nJHBBZERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdfmNyb3dkZnVuZGluZyRwQWREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSx4bGFiPSJwQWREZWcgaW4gV2VzdCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIFdlc3QiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXX5jcm93ZGZ1bmRpbmckcEFkRGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0pLGNvbD0icmVkIix0eXBlPSJsIikKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXX5jcm93ZGZ1bmRpbmckcEFkRGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdLHhsYWI9InBBZERlZyBpbiBTb3V0aCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIFNvdXRoIikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdfmNyb3dkZnVuZGluZyRwQWREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0pLGNvbD0icmVkIix0eXBlPSJsIikKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il1+Y3Jvd2RmdW5kaW5nJHBBZERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0seGxhYj0icEFkRGVnIGluIE5vcnRoZWFzdCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIE5vcnRoZWFzdCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il1+Y3Jvd2RmdW5kaW5nJHBBZERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0pLGNvbD0icmVkIix0eXBlPSJsIikKCiNwQmF0RGVnLS0tLS0tLS0tLS0KcGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il1+Y3Jvd2RmdW5kaW5nJHBCYXREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSx4bGFiPSJwQmF0RGVnIGluIE1pZHdlc3QiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBNaWR3ZXN0IikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il1+Y3Jvd2RmdW5kaW5nJHBCYXREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSksY29sPSJyZWQiLHR5cGU9ImwiKQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXX5jcm93ZGZ1bmRpbmckcEJhdERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdLHhsYWI9InBCYXREZWcgaW4gV2VzdCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIFdlc3QiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXX5jcm93ZGZ1bmRpbmckcEJhdERlZ1tjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCgpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl1+Y3Jvd2RmdW5kaW5nJHBCYXREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0seGxhYj0icEJhdERlZyBpbiBTb3V0aCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIFNvdXRoIikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdfmNyb3dkZnVuZGluZyRwQmF0RGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJTb3V0aCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCgpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdfmNyb3dkZnVuZGluZyRwQmF0RGVnW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXSx4bGFiPSJwQmF0RGVnIGluIE5vcnRoZWFzdCIseWxhYj0iU3VjY2Vzc2Z1bCByYXRlIGluIE5vcnRoZWFzdCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il1+Y3Jvd2RmdW5kaW5nJHBCYXREZWdbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCgojcEhpZ2gtLS0tLS0tLS0tLQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXX5jcm93ZGZ1bmRpbmckcEhpZ2hbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSx4bGFiPSJwSGlnaCBpbiBNaWR3ZXN0Iix5bGFiPSJTdWNjZXNzZnVsIHJhdGUgaW4gTWlkd2VzdCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdfmNyb3dkZnVuZGluZyRwSGlnaFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTWlkd2VzdCJdKSxjb2w9InJlZCIsdHlwZT0ibCIpCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdfmNyb3dkZnVuZGluZyRwSGlnaFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdLHhsYWI9InBIaWdoIGluIFdlc3QiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBXZXN0IikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il1+Y3Jvd2RmdW5kaW5nJHBIaWdoW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0pLGNvbD0icmVkIix0eXBlPSJsIikKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXX5jcm93ZGZ1bmRpbmckcEhpZ2hbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0seGxhYj0icEhpZ2ggaW4gU291dGgiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBTb3V0aCIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iU291dGgiXX5jcm93ZGZ1bmRpbmckcEhpZ2hbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0pLGNvbD0icmVkIix0eXBlPSJsIikKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il1+Y3Jvd2RmdW5kaW5nJHBIaWdoW2Nyb3dkZnVuZGluZyRSZWdpb249PSJOb3J0aGVhc3QiXSx4bGFiPSJwSGlnaCBpbiBOb3J0aGVhc3QiLHlsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBpbiBOb3J0aGVhc3QiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdfmNyb3dkZnVuZGluZyRwSGlnaFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0pLGNvbD0icmVkIix0eXBlPSJsIikKCgpgYGAKCiMjIyBHZW9ncmFwaHkgaW5mb3JtYXRpb24tdC50ZXN0CmBgYHtyIEdlb2dyYXBoeSBpbmZvcm1hdGlvbi10LnRlc3R9CiN0LnRlc3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKQojdC50ZXN0KGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdLGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0pCgoKI2NhbGN1YWx0ZSBQIFZhbHVlIGluIHRoZSB0LnRlc3Qgb2YgU3VjY2Vzc2Z1bCBSYXRlIGJ5IFJlZ2lvbiAKCnA9TlVMTAp0ZW1wPC1OVUxMCmZvciAobG9jYXRpb24xIGluIGMobGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pKSl7CiAgZm9yIChsb2NhdGlvbjIgaW4gYyhsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbikpKXsKICAgIGlmICgxKXsKICAgICAgdGVtcDwtdC50ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09bG9jYXRpb24xXSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PWxvY2F0aW9uMl0pCiAgICAgIGlmKHRlbXAkcC52YWx1ZTw9MC4xKXsKICAgICAgICAjcHJpbnQoYyhsb2NhdGlvbjEsbG9jYXRpb24yLHRlbXAkcC52YWx1ZSkpCiAgICAgIH0KICAgICAgcDwtYyhwLHRlbXAkcC52YWx1ZSl9fX0KU1IudC50ZXN0LnAudmxhdWU8LWFzLmRhdGEuZnJhbWUobWF0cml4KHAsNCw0KSxyb3cubmFtZXMgPSBjKGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSkpCmNvbG5hbWVzKFNSLnQudGVzdC5wLnZsYXVlKTwtYyhsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbikpCnByaW50KCJTdWNjZXNzZnVsIFJhdGUgYnkgUmVnaW9uIikKU1IudC50ZXN0LnAudmxhdWUKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNjYWxjdWFsdGUgUCBWYWx1ZSBpbiB0aGUgdC50ZXN0IG9mIENvdW50IG9mIHByb2plY3RzIGJ5IFJlZ2lvbiAKCnA9TlVMTAp0ZW1wPC1OVUxMCmZvciAobG9jYXRpb24xIGluIGMobGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pKSl7CiAgZm9yIChsb2NhdGlvbjIgaW4gYyhsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbikpKXsKICAgIGlmICgxKXsKICAgICAgdGVtcDwtdC50ZXN0KGxvZyhjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09bG9jYXRpb24xXSksbG9nKGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmckUmVnaW9uPT1sb2NhdGlvbjJdKSkKICAgICAgaWYodGVtcCRwLnZhbHVlPD0wLjEpewogICAgICAgICNwcmludChjKGxvY2F0aW9uMSxsb2NhdGlvbjIsdGVtcCRwLnZhbHVlKSkKICAgICAgfQogICAgICBwPC1jKHAsdGVtcCRwLnZhbHVlKX19fQpDUC50LnRlc3QucC52bGF1ZTwtYXMuZGF0YS5mcmFtZShtYXRyaXgocCw0LDQpLHJvdy5uYW1lcyA9IGMobGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pKSkKY29sbmFtZXMoQ1AudC50ZXN0LnAudmxhdWUpPC1jKGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSkKcHJpbnQoIkNvdW50IG9mIFByb2plY3RzIGJ5IFJlZ2lvbiAiKQpDUC50LnRlc3QucC52bGF1ZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2NhbGN1YWx0ZSBQIFZhbHVlIGluIHRoZSB0LnRlc3Qgb2YgQ291bnQgb2YgcHJvamVjdHMgYnkga21lYW5zIAoiTURTLUNhdGVnb3J5IgoKcD1OVUxMCgp0ZW1wPC1OVUxMCiNmb3IgKGxvY2F0aW9uMSBpbiAxOjQpewojICBmb3IgKGxvY2F0aW9uMiBpbiAxOjQpewojICAgIGlmICgxKXsKIyAgICAgIHRlbXA8LXQudGVzdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRNRFNfQ2F0ZWdvcnk9PWxvY2F0aW9uMV0sY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT1sb2NhdGlvbjJdKQojICAgICAgaWYodGVtcCRwLnZhbHVlPD0wLjEpewojICAgICAgICBwcmludChjKGxvY2F0aW9uMSxsb2NhdGlvbjIsdGVtcCRwLnZhbHVlKSkKIyAgICAgIH0KIyAgICAgIHA8LWMocCx0ZW1wJHAudmFsdWUpfX19CiNNRFNSLnQudGVzdC5wLnZsYXVlPC1hcy5kYXRhLmZyYW1lKG1hdHJpeChwLDQsNCkscm93Lm5hbWVzID0gYygxOjQpKQojY29sbmFtZXMoTURTUi50LnRlc3QucC52bGF1ZSk8LWMoMTo0KQojcHJpbnQoIlN1Y2Nlc3NmdWwgUmF0ZSBieSBSZWdpb24iKQojTURTUi50LnRlc3QucC52bGF1ZQoKCmBgYAoKIyMjIEdlb2dyYXBoeSBpbmZvcm1hdGlvbi10LWJvb3RzdHJhcApgYGB7cn0KYm9vdHN0cmFwZnVuY3Rpb250ZXN0PC1mdW5jdGlvbih0YXJnZXQuc2FtcGxlLG4pewogIHRlbXA9MAogIGZvcihpIGluIDE6bil7CiAgICB0ZW1wW2ldPW1lYW4odGFyZ2V0LnNhbXBsZVtzYW1wbGUoMTpsZW5ndGgodGFyZ2V0LnNhbXBsZSkscmVwbGFjZSA9IFRSVUUpXSkKICB9CiAgcmV0dXJuICh0ZW1wKQp9CgojU3VjY2Vzc2Z1bCByYXRlCk5vcnRoZWFzdC5TUi5ib290c3RyYXA9Ym9vdHN0cmFwZnVuY3Rpb250ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdLDEwMDApCldlc3QuU1IuYm9vdHN0cmFwPWJvb3RzdHJhcGZ1bmN0aW9udGVzdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJXZXN0Il0sMTAwMCkKTWlkd2VzdC5TUi5ib290c3RyYXA9Ym9vdHN0cmFwZnVuY3Rpb250ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik1pZHdlc3QiXSwxMDAwKQpTb3V0aC5TUi5ib290c3RyYXA9Ym9vdHN0cmFwZnVuY3Rpb250ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0sMTAwMCkKTm9ydGhlYXN0Lldlc3QuU1IudDwtdC50ZXN0KE5vcnRoZWFzdC5TUi5ib290c3RyYXAsV2VzdC5TUi5ib290c3RyYXApCk5vcnRoZWFzdC5Tb3V0aC5TUi50PC10LnRlc3QoTm9ydGhlYXN0LlNSLmJvb3RzdHJhcCxTb3V0aC5TUi5ib290c3RyYXApCk5vcnRoZWFzdC5NaWR3ZXN0LlNSLnQ8LXQudGVzdChOb3J0aGVhc3QuU1IuYm9vdHN0cmFwLE1pZHdlc3QuU1IuYm9vdHN0cmFwKQpXZXN0Lk1pZHdlc3QuU1IudDwtdC50ZXN0KFdlc3QuU1IuYm9vdHN0cmFwLE1pZHdlc3QuU1IuYm9vdHN0cmFwKQpXZXN0LlNvdXRoLlNSLnQ8LXQudGVzdChXZXN0LlNSLmJvb3RzdHJhcCxTb3V0aC5TUi5ib290c3RyYXApCk1pZHdlc3QuU291dGguU1IudDwtdC50ZXN0KE1pZHdlc3QuU1IuYm9vdHN0cmFwLFNvdXRoLlNSLmJvb3RzdHJhcCkKI3NpbmsoIi9Vc2Vycy9zbjB3ZnJlZS9Ecm9wYm94L1BoRF8xc3Rfc3R1ZHkvQlNUMjE1X1F1YW50aXRhdGl2ZV9SZXNlYXJjaF9NZXRob2RzX1Rlcm1fMS9RUk1fYXNzaWdubWVudC9yZXN1bHQvdC5ib290c3RyYXAudHh0IikKdC50ZXN0KE5vcnRoZWFzdC5TUi5ib290c3RyYXAsV2VzdC5TUi5ib290c3RyYXApCnQudGVzdChOb3J0aGVhc3QuU1IuYm9vdHN0cmFwLFNvdXRoLlNSLmJvb3RzdHJhcCkKdC50ZXN0KE5vcnRoZWFzdC5TUi5ib290c3RyYXAsTWlkd2VzdC5TUi5ib290c3RyYXApCnQudGVzdChXZXN0LlNSLmJvb3RzdHJhcCxNaWR3ZXN0LlNSLmJvb3RzdHJhcCkKdC50ZXN0KFdlc3QuU1IuYm9vdHN0cmFwLFNvdXRoLlNSLmJvb3RzdHJhcCkKdC50ZXN0KE1pZHdlc3QuU1IuYm9vdHN0cmFwLFNvdXRoLlNSLmJvb3RzdHJhcCkKI3NpbmsoKQpoaXN0KFdlc3QuU1IuYm9vdHN0cmFwKQoKCgoKCgoKCgojY291bnQgb2YgcHJvamVjdApOb3J0aGVhc3QuQ1AuYm9vdHN0cmFwPWJvb3RzdHJhcGZ1bmN0aW9udGVzdChjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdLDEwMDApCldlc3QuQ1AuYm9vdHN0cmFwPWJvb3RzdHJhcGZ1bmN0aW9udGVzdChjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSwxMDAwKQpNaWR3ZXN0LkNQLmJvb3RzdHJhcD1ib290c3RyYXBmdW5jdGlvbnRlc3QoY3Jvd2RmdW5kaW5nJGNvdW50X29mX0dyYW5kLlRvdGFsW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0sMTAwMCkKU291dGguQ1AuYm9vdHN0cmFwPWJvb3RzdHJhcGZ1bmN0aW9udGVzdChjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0sMTAwMCkKdC50ZXN0KE5vcnRoZWFzdC5DUC5ib290c3RyYXAsV2VzdC5DUC5ib290c3RyYXApCnQudGVzdChOb3J0aGVhc3QuQ1AuYm9vdHN0cmFwLFNvdXRoLkNQLmJvb3RzdHJhcCkKdC50ZXN0KE5vcnRoZWFzdC5DUC5ib290c3RyYXAsTWlkd2VzdC5DUC5ib290c3RyYXApCnQudGVzdChXZXN0LkNQLmJvb3RzdHJhcCxNaWR3ZXN0LkNQLmJvb3RzdHJhcCkKdC50ZXN0KFdlc3QuQ1AuYm9vdHN0cmFwLFNvdXRoLkNQLmJvb3RzdHJhcCkKdC50ZXN0KE1pZHdlc3QuQ1AuYm9vdHN0cmFwLFNvdXRoLkNQLmJvb3RzdHJhcCkKYGBgCgoKCgojIyMgR2VvZ3JhcGh5IGluZm9ybWF0aW9uLXdpbGNveC50ZXN0CmBgYHtyIEdlb2dyYXBoeSBpbmZvcm1hdGlvbi13aWxjb3gudGVzdH0Kd2lsY294LnRlc3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ik5vcnRoZWFzdCJdKQp3aWxjb3gudGVzdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0sY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0pCndpbGNveC50ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09IlNvdXRoIl0sY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0pCndpbGNveC50ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09Ildlc3QiXSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PSJNaWR3ZXN0Il0pCgoKI3dpbGNveC50ZXN0KGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iV2VzdCJdLGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmckUmVnaW9uPT0iTm9ydGhlYXN0Il0pCgoKI2NhbGN1YWx0ZSBQIFZhbHVlIGluIHRoZSB3aWxjb3gudGVzdCBvZiBTdWNjZXNzZnVsIFJhdGUgYnkgUmVnaW9uIAoKcD1OVUxMCnRlbXA8LU5VTEwKZm9yIChsb2NhdGlvbjEgaW4gYyhsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbikpKXsKICBmb3IgKGxvY2F0aW9uMiBpbiBjKGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSkpewogICAgaWYgKDEpewogICAgICB0ZW1wPC13aWxjb3gudGVzdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRSZWdpb249PWxvY2F0aW9uMV0sY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUmVnaW9uPT1sb2NhdGlvbjJdKQogICAgICBpZih0ZW1wJHAudmFsdWU8PTAuMSl7CiAgICAgICAgI3ByaW50KGMobG9jYXRpb24xLGxvY2F0aW9uMix0ZW1wJHAudmFsdWUpKQogICAgICB9CiAgICAgIHA8LWMocCx0ZW1wJHAudmFsdWUpfX19ClNSLndpbGNveC50ZXN0LnAudmxhdWU8LWFzLmRhdGEuZnJhbWUobWF0cml4KHAsNCw0KSxyb3cubmFtZXMgPSBjKGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSkpCmNvbG5hbWVzKFNSLndpbGNveC50ZXN0LnAudmxhdWUpPC1jKGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSkKcHJpbnQoIlN1Y2Nlc3NmdWwgUmF0ZSBieSBSZWdpb24iKQpTUi53aWxjb3gudGVzdC5wLnZsYXVlCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojY2FsY3VhbHRlIFAgVmFsdWUgaW4gdGhlIHQudGVzdCBvZiBDb3VudCBvZiBwcm9qZWN0cyBieSBSZWdpb24gCgpwPU5VTEwKdGVtcDwtTlVMTApmb3IgKGxvY2F0aW9uMSBpbiBjKGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSkpewogIGZvciAobG9jYXRpb24yIGluIGMobGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pKSl7CiAgICBpZiAoMSl7CiAgICAgIHRlbXA8LXdpbGNveC50ZXN0KGxvZyhjcm93ZGZ1bmRpbmckY291bnRfb2ZfR3JhbmQuVG90YWxbY3Jvd2RmdW5kaW5nJFJlZ2lvbj09bG9jYXRpb24xXSksbG9nKGNyb3dkZnVuZGluZyRjb3VudF9vZl9HcmFuZC5Ub3RhbFtjcm93ZGZ1bmRpbmckUmVnaW9uPT1sb2NhdGlvbjJdKSkKICAgICAgaWYodGVtcCRwLnZhbHVlPD0wLjEpewogICAgICAgICNwcmludChjKGxvY2F0aW9uMSxsb2NhdGlvbjIsdGVtcCRwLnZhbHVlKSkKICAgICAgfQogICAgICBwPC1jKHAsdGVtcCRwLnZhbHVlKX19fQpDUC53aWxjb3gudGVzdC5wLnZsYXVlPC1hcy5kYXRhLmZyYW1lKG1hdHJpeChwLDQsNCkscm93Lm5hbWVzID0gYyhsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbikpKQpjb2xuYW1lcyhDUC53aWxjb3gudGVzdC5wLnZsYXVlKTwtYyhsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbikpCnByaW50KCJDb3VudCBvZiBQcm9qZWN0cyBieSBSZWdpb24gIikKQ1Aud2lsY294LnRlc3QucC52bGF1ZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2NhbGN1YWx0ZSBQIFZhbHVlIGluIHRoZSB0LnRlc3Qgb2YgQ291bnQgb2YgcHJvamVjdHMgYnkga21lYW5zIAoiTURTLUNhdGVnb3J5IgpwPU5VTEwKCnRlbXA8LU5VTEwKI2ZvciAobG9jYXRpb24xIGluIDE6NCl7CiMgIGZvciAobG9jYXRpb24yIGluIDE6NCl7CiMgICAgaWYgKDEpewojICAgICAgdGVtcDwtd2lsY294LnRlc3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckTURTX0NhdGVnb3J5PT1sb2NhdGlvbjFdLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJE1EU19DYXRlZ29yeT09bG9jYXRpb24yXSkKIyAgICAgIGlmKHRlbXAkcC52YWx1ZTw9MC4xKXsKIyAgICAgICAgcHJpbnQoYyhsb2NhdGlvbjEsbG9jYXRpb24yLHRlbXAkcC52YWx1ZSkpCiMgICAgICB9CiMgICAgICBwPC1jKHAsdGVtcCRwLnZhbHVlKX19fQojTURTUi53aWxjb3gudGVzdC5wLnZsYXVlPC1hcy5kYXRhLmZyYW1lKG1hdHJpeChwLDQsNCkscm93Lm5hbWVzID0gYygxOjQpKQojY29sbmFtZXMoTURTUi53aWxjb3gudGVzdC5wLnZsYXVlKTwtYygxOjQpCiNwcmludCgiU3VjY2Vzc2Z1bCBSYXRlIGJ5IFJlZ2lvbiIpCiNNRFNSLndpbGNveC50ZXN0LnAudmxhdWUKYGBgCgoKCiMjIEZhY3RvcnMgYW5hbHlzaXMKVGhpcyBhcnRpY2xlIGlzIHRvIGFuYWx5c2UgdGhlIGZhY3RvcnMgdG8gdGhlIGNyb3dkZnVuZGluZyBzdWNjZXNzZnVsIHJhdGUuCkkgZ3Vlc3MgdGhlIEVkdWNhdGlvbiwgdGhlIGluZXF1aXR5IG9mIGZhbWlseSBpbmNvbWUgYW5kIHRoZSBwb3ZlcnR5IHJhdGUgbWF5IGJlIHJlbGF0ZWQgdG8gdGhlIGNyb3dkZnVuZGluZyBzdWNjZXNzZnVsIHJhdGUuIGFuZCBpbiB0aGUgZm9sbG93IGNvbnRleHQsIGkgd2lsbCBhbmFseXNlIHRoZSB0aG9zZSBmYWN0b3JzLgoKRmlyc3RseSwgVGhlIFN0YXRpc3RpY2FsIFN1bW1hcnkKIyMjIEZhY3RvcnMgQW5hbHlzaXMtU3RhdGlzdGljYWwgU3VtbWFyeQpgYGB7ciBGYWN0b3JzIEFuYWx5c2lzLVN0YXRpc3RpY2FsIFN1bW1hcnl9CmxpYnJhcnkobW9tZW50cykKCnN1bW1hcnkoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSkKa3VydG9zaXMoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSkKCnN1bW1hcnkoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikKa3VydG9zaXMoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikKCnN1bW1hcnkoY3Jvd2RmdW5kaW5nJHBBZERlZykKa3VydG9zaXMoY3Jvd2RmdW5kaW5nJHBBZERlZykKCnN1bW1hcnkoY3Jvd2RmdW5kaW5nJFBvdlJhdGUxKQprdXJ0b3Npcyhjcm93ZGZ1bmRpbmckUG92UmF0ZTEpCgpgYGAKCiMjIyBGYWN0b3JzIEFuYWx5c2lzLVBsb3QgZm9yIEZhY3RvcnMKYGBge3IgUGxvdCBmb3IgRmFjdG9yc30KCmJveHBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjcm93ZGZ1bmRpbmckR2luaUNvZWZmLGNyb3dkZnVuZGluZyRwQWREZWcsY3Jvd2RmdW5kaW5nJFBvdlJhdGUxLG5hbWVzID0gYygiU3VjY2Vzc2Z1bCBSYXRlIiwiR2luaUNvZWZmIiwiSGlnaGVyIEVkdWNhdGlvbiIsIlBvdlJhdGUxIiksbWFpbj0iRmFjdG9ycyBCb3ggUGxvdCIpCgpwYXIobWZyb3c9YygxLDQpKQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUsY29sPWNyb3dkZnVuZGluZyRSZWdpb24scGNoPTEwLGNleD0xLjUseGxhYj0iU3RhdGUiLHlsYWI9IlN1Y2Nlc3NmdWwgUmF0ZSIseGF4dD0ibiIsbWFpbj0iU3VjY2Vzc2Z1bCBSYXRlIFBsb3Qgd2l0aCBsb3dlc3MgbGluZSIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWwpLHR5cGU9ImwiKQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZCA9IGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSxjZXggPSAwLjgsIHBjaCA9IDEsY29sPTE6NCkKCnBsb3QoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixjb2w9Y3Jvd2RmdW5kaW5nJFJlZ2lvbixwY2g9MTgsY2V4PTEuNSx4bGFiPSJTdGF0ZSIseGF4dD0ibiIseWxhYj0iR2luaUNvZWZmICIseGF4dD0ibiIsbWFpbj0iR2luaUNvZWZmIFBsb3Qgd2l0aCBsb3dlc3MgbGluZSIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZiksdHlwZT0ibCIpCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kID0gbGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pLGNleCA9IDAuOCwgcGNoID0gMSxjb2w9MTo0KQoKcGxvdChjcm93ZGZ1bmRpbmckcEFkRGVnLGNvbD1jcm93ZGZ1bmRpbmckUmVnaW9uLHBjaD0xNSxjZXg9MS41LHhsYWI9IlN0YXRlIix4YXh0PSJuIix5bGFiPSJBZGFuY2VkIEVkdWNhdGlvbiBSYXRlIix4YXh0PSJuIixtYWluPSJBZGFuY2VkIEVkdWNhdGlvbiBSYXRlIFBsb3Qgd2l0aCBsb3dlc3MgbGluZSIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJHBBZERlZyksdHlwZT0ibCIpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGxldmVscyhjcm93ZGZ1bmRpbmckUmVnaW9uKSxjZXggPSAwLjgsIHBjaCA9IDEsY29sPTE6NCkKCnBsb3QoY3Jvd2RmdW5kaW5nJHBBZERlZyxjb2w9Y3Jvd2RmdW5kaW5nJFJlZ2lvbixwY2g9MTUsY2V4PTEuNSx4bGFiPSJTdGF0ZSIseGF4dD0ibiIseWxhYj0iQWRhbmNlZCBFZHVjYXRpb24gUmF0ZSIseGF4dD0ibiIsbWFpbj0iQWRhbmNlZCBFZHVjYXRpb24gUmF0ZSBQbG90IHdpdGggbG93ZXNzIGxpbmUiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRwQWREZWcpLHR5cGU9ImwiKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBsZXZlbHMoY3Jvd2RmdW5kaW5nJFJlZ2lvbiksY2V4ID0gMC44LCBwY2ggPSAxLGNvbD0xOjQpCgpyZXF1aXJlKGNhcikKc2NhdHRlcnBsb3RNYXRyaXgofnN1Y2Nlc3NmdWxfcmF0ZStQb3ZSYXRlMStwQWREZWcsZGF0YT1jcm93ZGZ1bmRpbmcsc3ByZWFkPTEsdXBwZXIucGFuZWw9TlVMTCxtYWluPSJTY2F0dGVyIFBsb3QgTWF0cml4IG9uIEZhY3RvcnMiKQoKcmVxdWlyZShtb21lbnRzKQprdXJ0b3Npcyhjcm93ZGZ1bmRpbmckcEFkRGVnKQojcGxvdChjcm93ZGZ1bmRpbmckUG92UmF0ZTEsY29sPSJibGFjayIscGNoPTE2LHhsYWI9IlN0YXRlIix4YXh0PSJuIix5bGFiPSJQb3ZlcnR5IFJhdGUiLHhheHQ9Im4iLG1haW49IlBvdmVydHkgUmF0ZSBQbG90IikKI2xpYnJhcnkoZ3JpZEV4dHJhKQoKc3VtbWFyeShsbShsb2coc3VjY2Vzc2Z1bF9yYXRlKX5sb2coQ29sbGVjdGl2aXNtKSxkYXRhPWNyb3dkZnVuZGluZykpCmdncGxvdChjcm93ZGZ1bmRpbmcsYWVzKHk9c3VjY2Vzc2Z1bF9yYXRlLHg9Q29sbGVjdGl2aXNtKSkrZ2VvbV9wb2ludCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iKQoKYGBgCgoKCgoKYGBge3Igc2NhdHRlcnBsb3R9CmxpYnJhcnkoY2FyKQpzY2F0dGVycGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlLGxvZyhjcm93ZGZ1bmRpbmckYXZlcmFnZV9vZl9nb2FsX0dyYW5kLlRvdGFsKSxwY2g9MTkpCnNjYXR0ZXJwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixwY2g9MTkpCnNjYXR0ZXJwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJFBvdlJhdGUxLHBjaD0xOSkKc2NhdHRlcnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckRGVuc2l0eW0yLHBjaD0xOSkKc2NhdHRlcnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckcEhpZ2gscGNoPTE5KQpzY2F0dGVycGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlfmNyb3dkZnVuZGluZyRwQmF0RGVnLHBjaD0xOSkKc2NhdHRlcnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckcEFkRGVnLHBjaD0xOSkKCgpgYGAKCgojIyMgRmFjdG9ycyBBbmFseXNpcy1TdWNjZXNzZnVsIFJhdGV8UG92UmF0ZTEKYGBge3IgU3VjY2Vzc2Z1bCBSYXRlLVBvdlJhdGUxfQojcmVkbyBzY2F0dGVycGxvdCB3aXRoIFN1Y2Nlc3NmdWwgUmF0ZS1Qb3ZSYXRlMQpzY2F0dGVycGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlLGNyb3dkZnVuZGluZyRQb3ZSYXRlMSxwY2g9MTkpCgojYW5vdmEoc3VjY2Vzc2Z1bF9yYXRlMlBvdlJhdGUxKQpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdChjcm93ZGZ1bmRpbmcsYWVzKHg9UG92UmF0ZTEseT1zdWNjZXNzZnVsX3JhdGUsbWFpbiA9ICJTdWNjZXNzZnVsIHJhdGV+UG92UmF0ZSIpKStnZW9tX3BvaW50KGFlcyhjb2w9UmVnaW9uKSkrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIikrZ2d0aXRsZSgiU3VjY2Vzc2Z1bCBSYXRlLVBvdlJhdGUxIFBsb3QiKSt0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQoKcGFyKG1mcm93PWMoMSwyKSkKCmJveHBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjcm93ZGZ1bmRpbmckUG92UmF0ZTEsbmFtZXM9YygiU3VjY2Vzc2Z1bCBSYXRlIiwiUG92UmF0ZTEiKSkKYm94cGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRQb3ZSYXRlMT5tZWFuKGNyb3dkZnVuZGluZyRQb3ZSYXRlMSldLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFBvdlJhdGUxPD1tZWFuKGNyb3dkZnVuZGluZyRQb3ZSYXRlMSldLGNvbCA9IGMoImdyZWVuIiwiZGVlcHNreWJsdWUiKSxuYW1lcz1jKCJTdWNjZXNzZnVsJShIaWdoIFBvdlJhdGUpIiwiU3VjY2Vzc2Z1bCUoTG93IFBvdlJhdGUpIikseGxhYj0iU3VjY2Vzc2Z1bCByYXRlIGJ5IFBvdlJhdGUxIikKCgoKdC50ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJFBvdlJhdGUxPm1lYW4oY3Jvd2RmdW5kaW5nJFBvdlJhdGUxKV0sY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckUG92UmF0ZTE8PW1lYW4oY3Jvd2RmdW5kaW5nJFBvdlJhdGUxKV0pCgoKCnBsb3QoY3Jvd2RmdW5kaW5nJFBvdlJhdGUxLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUscGNoPTE5LGNvbD1jcm93ZGZ1bmRpbmckUmVnaW9uLHlsYWI9IlN1Y2Nlc3NmdWwgUmF0ZSIseGxhYj0iUG92UmF0ZTEiLG1haW49IlN1Y2Nlc3NmdWwgUmF0ZS1Qb3ZSYXRlMSBQbG90IHdpdGggbG93ZXNzIGxpbmUiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRQb3ZSYXRlMSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlLGY9MS8zKSxwY2g9NCxjb2w9Im9yYW5nZSIsdHlwZT0ibCIpCiNhYmxpbmUobG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckUG92UmF0ZTEpLGNvbD0ib3JhbmdlIikKbGVnZW5kKCJib3R0b21yaWdodCIsbGVnZW5kID0gbGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pLGNleCA9IDAuOCwgcGNoID0gMTksY29sPTE6NCkKCgpxcXBsb3QoY3Jvd2RmdW5kaW5nJFBvdlJhdGUxLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUscGNoPTEsY29sPWNyb3dkZnVuZGluZyRSZWdpb24sbWFpbj0iUVEgcGxvdDogKFN1Y2Nlc3NmdWwgUmF0ZSAmIFBvdlJhdGUpIikKcXFsaW5lKGNyb3dkZnVuZGluZyRQb3ZSYXRlMSAsY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjb2w9InJlZCIpCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kID0gbGV2ZWxzKGNyb3dkZnVuZGluZyRSZWdpb24pLCBwY2ggPSAxOSxjb2w9MTozKQoKCgoKcGFyKG1mcm93PWMoMSwxKSkKI3Fxbm9ybShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlLGNvbD1jcm93ZGZ1bmRpbmckUmVnaW9uLHhsYWI9IlN1Y2Nlc3NmdWwgUmF0ZSIpCiNxcWxpbmUoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjb2w9InJlZCIpCnFxbm9ybShjcm93ZGZ1bmRpbmckUG92UmF0ZTEsY29sPWNyb3dkZnVuZGluZyRSZWdpb24scGNoPTE4LHhsYWIgPSJQb3ZSYXRlMSIpCnFxbGluZShjcm93ZGZ1bmRpbmckUG92UmF0ZTEsY29sPSJyZWQiKQpgYGAKCmBgYHtyIHN1Y2Nlc3NmdWxfcmF0ZS1Qb3ZSYXRlMTpnZ3Bsb3R9CnJlcXVpcmUoZ2dwbG90MikKZ2dwbG90KGNyb3dkZnVuZGluZyxhZXMoeD1Qb3ZSYXRlMSx5PXN1Y2Nlc3NmdWxfcmF0ZSxtYWluID0gIlN1Y2Nlc3NmdWwgcmF0ZX5Qb3ZSYXRlMSIpKStnZW9tX3BvaW50KGFlcyhncm91cD0xLGNvbD1SZWdpb24pKStnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLHNlPUZBTFNFLGFlcyhncm91cD0yLGNvbD0iTG9lc3MgTGluZSIpLGx0eT0iZGFzaGVkIikrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIixhZXMoZ3JvdXA9Mixjb2w9IlJlZ3Jlc3Npb24gTGluZSIpLGNleD0wLjgsbHR5PTEpK2dndGl0bGUoIlN1Y2Nlc3NmdWwgUmF0ZS1Qb3ZSYXRlMSBQbG90IHdpdGggTG9lc3MgbGluZSBhbmQgT0xTLWVzdGltYXRlZCBsaW5lIikrbGFicyh4PSJQb3ZSYXRlMSIseT0iU3VjY2Vzc2Z1bCBSYXRlIikrdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoaGp1c3Q9MC41KSkrc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJwdXJwbGUiLCAibWFnZW50YSIsICJvcmFuZ2UiLCJyZWQiLCAiYmx1ZSIsICJncmVlbjMiICksZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGU9IkxlZ2VuZCIsb3ZlcnJpZGUuYWVzID0gbGlzdChsaW5ldHlwZSA9IGMoICJkYXNoZWQiLHJlcCgiYmxhbmsiLCAyKSwgInNvbGlkIixyZXAoImJsYW5rIiwgMikpLHNoYXBlID0gYyhOQSxyZXAoMTYsIDIpLCBOQSxyZXAoMTYsIDIpICkpKSkKCgoKYGBgCgoKCmBgYHtyIHJlc2V0LUNob3cgdGVzdH0KcmVxdWlyZShsbXRlc3QpCnJlcXVpcmUoc3RydWNjaGFuZ2UpCnJlc2V0dGVzdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlfmNyb3dkZnVuZGluZyRHaW5pQ29lZmYrKGNyb3dkZnVuZGluZyRHaW5pQ29lZmYpXjIpCgpzY3Rlc3QobG9nKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUpfmxvZyhjcm93ZGZ1bmRpbmckR2luaUNvZWZmKSx0eXBlPSJDaG93IikKCnJlc2V0dGVzdChsb2coY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSl+bG9nKGNyb3dkZnVuZGluZyRwQWREZWcpKQoKc2N0ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJHBBZERlZyx0eXBlPSJDaG93Iixwb2ludD0wLjEyKQpwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJHBBZERlZykKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlfmNyb3dkZnVuZGluZyRwQWREZWcpLHR5cGU9ImwiKQpgYGAKCmBgYHtyIHRlc3Rmb3Jub3RoaW5nfQpiPU5BCmZvciAoaSBpbiAxNTA6MTcwKXsKYTwtc2N0ZXN0KGxvZyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlKX5sb2coY3Jvd2RmdW5kaW5nJHBBZERlZyksdHlwZT0iQ2hvdyIscG9pbnQ9aS8xMDAwKQpiW2ldPWEkcC52YWx1ZQojaWYgKGEkcC52YWx1ZTw9MC4wNSl7cHJpbnQgKGkvMTAwKX0KfQpwbG90KGIsdHlwZT0ibCIpCmJbOV0Kc2N0ZXN0KGxvZyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlKX5sb2coY3Jvd2RmdW5kaW5nJHBBZERlZyksdHlwZT0iQ2hvdyIscG9pbnQ9MC4xNykKYGBgCgojIyMgRmFjdG9ycyBBbmFseXNpcy1TdWNjZXNzZnVsIFJhdGV8R2luaUNvZWZmCmBgYHtyIFN1Y2Nlc3NmdWwgUmF0ZS1HaW5pQ29lZmZ9CgpnZ3Bsb3QoY3Jvd2RmdW5kaW5nLGFlcyh4PUdpbmlDb2VmZix5PXN1Y2Nlc3NmdWxfcmF0ZSxtYWluID0gIlN1Y2Nlc3NmdWwgcmF0ZX5HaW5pQ29lZmYiKSkrZ2VvbV9wb2ludChncm91cD0xLGFlcyhjb2w9UmVnaW9uKSkrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIixzZT1GQUxTRSxsdHk9ImRhc2hlZCIsYWVzKGdyb3VwPTIsY29sPSJUcmVuZGxpbmUiKSkrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIixhZXMoZ3JvdXA9Mixjb2w9IlJlZ3Jlc3Npb24iKSxsdHk9MSxjZXg9MC41KStnZ3RpdGxlKCJTdWNjZXNzZnVsIFJhdGUtR2luaUNvZWZmIFBsb3Qgd2l0aCBsb2VzcyBsaW5lIGFuZCBPTFMtZXN0aW1hdGVkIGxpbmUiKStsYWJzKHg9IkdpbmlDb2VmZiIseT0iU3VjY2Vzc2Z1bCBSYXRlIikrdGhlbWUocGxvdC50aXRsZT1lbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKCgphbm92YShzdWNjZXNzZnVsX3JhdGUyR2luaUNvZWZmKQoKCnQudGVzdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRHaW5pQ29lZmY+bWVhbihjcm93ZGZ1bmRpbmckR2luaUNvZWZmKV0sY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckR2luaUNvZWZmPD1tZWFuKGNyb3dkZnVuZGluZyRHaW5pQ29lZmYpXSkKCnBhcihtZnJvdz1jKDEsMikpCgoKYm94cGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlLGNyb3dkZnVuZGluZyRHaW5pQ29lZmYsbmFtZXM9YygiU3VjY2Vzc2Z1bCBSYXRlIiwiR2luaUNvZWZmIikpCmJveHBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZVtjcm93ZGZ1bmRpbmckR2luaUNvZWZmPm1lYW4oY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZildLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZjw9bWVhbihjcm93ZGZ1bmRpbmckR2luaUNvZWZmKV0sY29sID0gYygiZGFya29yY2hpZDIiLCJkb2RnZXJibHVlIiksbmFtZXM9YygiU3VjY2Vzc2Z1bCUoSGlnaCBHaW5pQ29lZmYpIiwiU3VjY2Vzc2Z1bCUoTG93IEdpbmlDb2VmZikiKSx4bGFiPSJTdWNjZXNzZnVsIHJhdGUgYnkgR2luaUNvZWZmIikKCgoKCgoKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjcm93ZGZ1bmRpbmckR2luaUNvZWZmLGY9MS8zICxwY2g9MTksY29sPSJibHVlIix4bGFiPSJTdWNjZXNzZnVsIFJhdGUiLHlsYWI9IkdpbmlDb2VmZiIsbWFpbj0iU3VjY2Vzc2Z1bCBSYXRlLUdpbmlDb2VmZiBQbG90IHdpdGggbG93ZXNzIGxpbmUiKQpwb2ludHMobG93ZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUsY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixmPTEvMykscGNoPTQsY29sPSJyZWQiLHR5cGU9ImwiKQoKCnFxcGxvdChjcm93ZGZ1bmRpbmckR2luaUNvZWZmLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUscGNoPTE4LG1haW49IlEtUSBQbG90OiBTdWNjZXNzZnVsIFJhdGUtR2luaUNvZWZmIHdpdGggbG93ZXNzIGxpbmUiLHhsYWI9IkdpbmkgQ29lZmZpY2llbnQiLHlsYWI9IlN1Y2Nlc3NmdWwgUmF0ZSIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlKSx0eXBlPSJsIixjb2w9InJlZCIpCgojcXFsaW5lKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUsY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikKCgojcXFub3JtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUsY29sPSJvcmFuZ2UiLHhsYWI9IlN1Y2Nlc3NmdWwgUmF0ZSIpCiNxcWxpbmUoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjb2w9InJlZCIpCnBhcihtZnJvdz1jKDEsMSkpCnFxbm9ybShjcm93ZGZ1bmRpbmckR2luaUNvZWZmLGNvbD0iYmx1ZSIscGNoPTIwLHhsYWI9IkdpbmlDb2VmZiIpCnFxbGluZShjcm93ZGZ1bmRpbmckR2luaUNvZWZmLGNvbD0icmVkIikKCgpzdW1tYXJ5KGxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikpCgpgYGAKCgpgYGB7ciBzdWNjZXNzZnVsX3JhdGUtR2luaUNvZWZmOmdncGxvdH0KCmdncGxvdChjcm93ZGZ1bmRpbmcsYWVzKHg9R2luaUNvZWZmLHk9c3VjY2Vzc2Z1bF9yYXRlLG1haW4gPSAiU3VjY2Vzc2Z1bCByYXRlfkdpbmlDb2VmZiIpKStnZW9tX3BvaW50KGFlcyhncm91cD0xLGNvbD1SZWdpb24pKStnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLHNlPUZBTFNFLGFlcyhncm91cD0yLGNvbD0iTG9lc3MgTGluZSIpLGx0eT0iZGFzaGVkIikrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIixhZXMoZ3JvdXA9Mixjb2w9IlJlZ3Jlc3Npb24gTGluZSIpLGNleD0wLjgsbHR5PTEpK2dndGl0bGUoIlN1Y2Nlc3NmdWwgUmF0ZS1HaW5pQ29lZmYgUGxvdCB3aXRoIExvZXNzIGxpbmUgYW5kIE9MUy1lc3RpbWF0ZWQgbGluZSIpK2xhYnMoeD0iR2luaUNvZWZmIix5PSJTdWNjZXNzZnVsIFJhdGUiKSt0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChoanVzdD0wLjUpKStzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoInB1cnBsZSIsICJtYWdlbnRhIiwgIm9yYW5nZSIsInJlZCIsICJibHVlIiwgImdyZWVuMyIgKSxndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZT0iTGVnZW5kIixvdmVycmlkZS5hZXMgPSBsaXN0KGxpbmV0eXBlID0gYyggImRhc2hlZCIscmVwKCJibGFuayIsIDIpLCAic29saWQiLHJlcCgiYmxhbmsiLCAyKSksc2hhcGUgPSBjKE5BLHJlcCgxNiwgMiksIE5BLHJlcCgxNiwgMikgKSkpKQoKCgpgYGAKCgoKCiMjIyBGYWN0b3JzIEFuYWx5c2lzLVN1Y2Nlc3NmdWwgUmF0ZXxBZHZhbmNlZCBFZHVjYXRpb25dCiAKYGBge3Igc3VjY2Vzc2Z1bF9yYXRlLXBBZERlZzpnZ3Bsb3R9CmdncGxvdChjcm93ZGZ1bmRpbmcsYWVzKHg9cEFkRGVnLHk9c3VjY2Vzc2Z1bF9yYXRlKSkrZ2VvbV9wb2ludChhZXMoY29sPVJlZ2lvbikpK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsc2U9RkFMU0UsbHR5PTIsYWVzKGNvbD0iTG9lc3MgTGluZSIpKStnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLGFlcyhjb2w9IlJlZ3Jlc3Npb24gTGluZSIpLGNleD0wLjgpK2dndGl0bGUoIlN1Y2Nlc3NmdWwgUmF0ZS1BZGFuY2VkIEVkdWNhdGlvbiBQbG90IHdpdGggTG9lc3MgbGluZSBhbmQgT0xTLWVzdGltYXRlZCBsaW5lIikrbGFicyh4PSJBZHZhbmNlZCBFZHVjYXRpb24iLHk9IlN1Y2Nlc3NmdWwgUmF0ZSIpK3RoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpK3NjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygicHVycGxlIiwgIm1hZ2VudGEiLCJvcmFuZ2UiLCAicmVkIiwgImJsdWUiLCAiZ3JlZW4zIiApLGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlPSJMZWdlbmQiLG92ZXJyaWRlLmFlcyA9IGxpc3QobGluZXR5cGUgPSBjKCAiZGFzaGVkIixyZXAoImJsYW5rIiwgMiksICJzb2xpZCIscmVwKCJibGFuayIsIDIpKSxzaGFwZSA9IGMoIE5BLHJlcCgxNiwgMiksIE5BLHJlcCgxNiwgMikpKSkpCmBgYAoKCmBgYHtyIFN1Y2Nlc3NmdWwgUmF0ZS1BZHZhbmNlZCBFZHVjYXRpb259CmdncGxvdChjcm93ZGZ1bmRpbmcsYWVzKHg9cEFkRGVnLHk9c3VjY2Vzc2Z1bF9yYXRlKSkrZ2VvbV9wb2ludChhZXMoY29sPVJlZ2lvbikpK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsc2U9RkFMU0UsbHR5PTIpK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsY29sPSJyZWQiLGNleD0wLjgpK2dndGl0bGUoIlN1Y2Nlc3NmdWwgUmF0ZS1BZGFuY2VkIEVkdWNhdGlvbiBQbG90IikrbGFicyh4PSJBZHZhbmNlZCBFZHVjYXRpb24iLHk9IlN1Y2Nlc3NmdWwgUmF0ZSIpK3RoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCgpwbG90KGxvd2Vzcyhjcm93ZGZ1bmRpbmckcEFkRGVnLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUpKQoKYW5vdmEoc3VjY2Vzc2Z1bF9yYXRlMnBBZERlZykKCnBhcihtZnJvdz1jKDEsMikpCgpib3hwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUsY3Jvd2RmdW5kaW5nJHBBZERlZyxuYW1lcz1jKCJTdWNjZXNzZnVsIHJhdGUiLCJBZGFuY2VkIEVkdWNhdGlvbiIpKQpib3hwbG90KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJHBBZERlZz5tZWFuKGNyb3dkZnVuZGluZyRwQWREZWcpXSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRwQWREZWc8PW1lYW4oY3Jvd2RmdW5kaW5nJHBBZERlZyldLGNvbCA9IGMoImRhcmtvcmNoaWQyIiwiZG9kZ2VyYmx1ZSIpLG5hbWVzPWMoIlN1Y2Nlc3NmdWwlKEhpZ2ggQWRhbmNlZCBFZHVjYXRpb24pIiwiU3VjY2Vzc2Z1bCUoTG93IEFkYW5jZWQgRWR1Y2F0aW9uKSIpLHhsYWI9IlN1Y2Nlc3NmdWwgcmF0ZSBieSBBZGFuY2VkIEVkdWNhdGlvbiIpCgoKdC50ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJHBBZERlZz5tZWFuKGNyb3dkZnVuZGluZyRwQWREZWcpXSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRwQWREZWc8PW1lYW4oY3Jvd2RmdW5kaW5nJHBBZERlZyldKQoKCnBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjcm93ZGZ1bmRpbmckcEFkRGVnLGY9MS8zICxwY2g9MTksY29sPSJibHVlIix4bGFiPSJTdWNjZXNzZnVsIFJhdGUiLHlsYWI9IkFkYW5jZWQgRWR1Y2F0aW9uIixtYWluPSJTdWNjZXNzZnVsIFJhdGUtQWRhbmNlZCBFZHVjYXRpb24gUGxvdCB3aXRoIGxvd2VzcyBsaW5lIikKcG9pbnRzKGxvd2Vzcyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlLGNyb3dkZnVuZGluZyRwQWREZWcsZj0xLzMpLHBjaD00LGNvbD0icmVkIix0eXBlPSJsIikKCgpxcXBsb3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjcm93ZGZ1bmRpbmckcEFkRGVnLHBjaD0xOSxjb2w9InJlZCIsbWFpbj0iUS1RIFBsb3Q6IFN1Y2Nlc3NmdWwgUmF0ZS1BZGFuY2VkIEVkdWNhdGlvbiIpCnFxbGluZShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlLGNyb3dkZnVuZGluZyRwQWREZWcpCgoKI3Fxbm9ybShjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlLGNvbD0ib3JhbmdlIix4bGFiPSJTdWNjZXNzZnVsIFJhdGUiKQojcXFsaW5lKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUsY29sPSJyZWQiKQpwYXIobWZyb3c9YygxLDEpKQpxcW5vcm0oY3Jvd2RmdW5kaW5nJHBBZERlZyxjb2w9ImJsdWUiLHBjaD0yMCx4bGFiPSJBZGFuY2VkIEVkdWNhdGlvbiIpCnFxbGluZShjcm93ZGZ1bmRpbmckcEFkRGVnLGNvbD0icmVkIikKCnN1bW1hcnkobG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckcEFkRGVnKSkKCmBgYAojIyMgRmFjdG9ycyBBbmFseXNpcy0gR2luaWNvZWZmfEFkdmFuY2VkIEVkdWNhdGlvbgoKYGBge3IgR2luaWNvZWZmfEFkdmFuY2VkIEVkdWNhdGlvbn0KcmVxdWlyZShnZ3Bsb3QyKQpnZ3Bsb3QoY3Jvd2RmdW5kaW5nLGFlcyh4PXBBZERlZyx5PUdpbmlDb2VmZikpK2dlb21fcG9pbnQoYWVzKGNvbD1SZWdpb24pKStnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLHNlPUZBTFNFLGx0eT0yKStnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLGNvbD0icmVkIixjZXg9MC44KStnZ3RpdGxlKCJTdWNjZXNzZnVsIFJhdGUtQWRhbmNlZCBFZHVjYXRpb24gUGxvdCIpK2xhYnMoeD0iQWR2YW5jZWQgRWR1Y2F0aW9uIix5PSJHaW5pQ29lZmYiKSt0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQoKcGxvdChsb3dlc3MoY3Jvd2RmdW5kaW5nJHBBZERlZyxjcm93ZGZ1bmRpbmckR2luaUNvZWZmKSkKCgoKcGFyKG1mcm93PWMoMSwyKSkKCmJveHBsb3QoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixjcm93ZGZ1bmRpbmckcEFkRGVnLG5hbWVzPWMoIlN1Y2Nlc3NmdWwgcmF0ZSIsIkFkYW5jZWQgRWR1Y2F0aW9uIikpCmJveHBsb3QoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckcEFkRGVnPm1lYW4oY3Jvd2RmdW5kaW5nJHBBZERlZyldLGNyb3dkZnVuZGluZyRHaW5pQ29lZmZbY3Jvd2RmdW5kaW5nJHBBZERlZzw9bWVhbihjcm93ZGZ1bmRpbmckcEFkRGVnKV0sY29sID0gYygiZGFya29yY2hpZDIiLCJkb2RnZXJibHVlIiksbmFtZXM9YygiR2luaUNvZWZmKEhpZ2ggQWRhbmNlZCBFZHVjYXRpb24pIiwiR2luaUNvZWZmKExvdyBBZGFuY2VkIEVkdWNhdGlvbikiKSx4bGFiPSJHaW5pQ29lZmYgYnkgQWRhbmNlZCBFZHVjYXRpb24iKQoKCnQudGVzdChjcm93ZGZ1bmRpbmckR2luaUNvZWZmW2Nyb3dkZnVuZGluZyRwQWREZWc+bWVhbihjcm93ZGZ1bmRpbmckcEFkRGVnKV0sY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZltjcm93ZGZ1bmRpbmckcEFkRGVnPD1tZWFuKGNyb3dkZnVuZGluZyRwQWREZWcpXSkKCgpwbG90KGNyb3dkZnVuZGluZyRHaW5pQ29lZmYsY3Jvd2RmdW5kaW5nJHBBZERlZyxmPTEvMyAscGNoPTE5LGNvbD0iYmx1ZSIseGxhYj0iU3VjY2Vzc2Z1bCBSYXRlIix5bGFiPSJBZGFuY2VkIEVkdWNhdGlvbiIsbWFpbj0iR2luaUNvZWZmLUFkYW5jZWQgRWR1Y2F0aW9uIFBsb3Qgd2l0aCBsb3dlc3MgbGluZSIpCnBvaW50cyhsb3dlc3MoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixjcm93ZGZ1bmRpbmckcEFkRGVnLGY9MS8zKSxwY2g9NCxjb2w9InJlZCIsdHlwZT0ibCIpCgoKcXFwbG90KGNyb3dkZnVuZGluZyRHaW5pQ29lZmYsY3Jvd2RmdW5kaW5nJHBBZERlZyxwY2g9MTksY29sPSJyZWQiLG1haW49IlEtUSBQbG90OiBHaW5pQ29lZmYtQWRhbmNlZCBFZHVjYXRpb24iKQpxcWxpbmUoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixjcm93ZGZ1bmRpbmckcEFkRGVnKQoKCiNxcW5vcm0oY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixjb2w9Im9yYW5nZSIseGxhYj0iR2luaUNvZWZmIikKI3FxbGluZShjcm93ZGZ1bmRpbmckR2luaUNvZWZmLGNvbD0icmVkIikKcGFyKG1mcm93PWMoMSwxKSkKcXFub3JtKGNyb3dkZnVuZGluZyRwQWREZWcsY29sPSJibHVlIixwY2g9MjAseGxhYj0iQWRhbmNlZCBFZHVjYXRpb24iKQpxcWxpbmUoY3Jvd2RmdW5kaW5nJHBBZERlZyxjb2w9InJlZCIpCgoKCmBgYAoKCmBgYHtyfQoKcmVxdWlyZShjb3JwY29yKQpyZXF1aXJlKGdnbSkKCgp4Y29yPWNvcihzZSkj55u45YWz57O75pWw55+p6Zi1IAp4cGNvcj1jb3IycGNvcih4Y29yKSPlgY/nm7jlhbPnn6npmLUKeHBjb3IKeGNvcgpyZXF1aXJlKHBzeWNoKQp1PC1jb2xuYW1lcyh4Y29yKQp1CgoKcGNvcnRlc3RfZGV2PC1mdW5jdGlvbih4X3NldCx5LGRhdGFzZXQpewogIHJlcXVpcmUocHN5Y2gpCiAgcmVxdWlyZShnZ20pCiAgZm9yIChudiBpbiBsZW5ndGgoeF9zZXQpICl7CiAgICAKICAgIGRhdGFfc3Vic2V0PC1kYXRhc2V0CiAgICBkYXRhX3N1YnNldFt4X3NldFtudl1dPC1OVUxMCiAgICB4X3N1YnNldD14X3NldAogICAgeF9zdWJzZXQ9eF9zdWJzZXRbLW52XQogICAganNibCA8LSBjKHhfc3Vic2V0LHkpICAgI+imgeiuoeeul+eahOebuOWFs+ezu+aVsOeahOWPmOmHj+S4i+aghwogICAgdGpibCA8LSBjKHhfc2V0W252XSkgICPmnaHku7Yo5o6n5Yi2KeWPmOmHj+eahOS4i+agh++8jOWNs+imgeaOkumZpOW9seWTjeeahOWPmOmHj+eahOS4i+aghwogICAgcjwtcGNvcihjKGpzYmwsdGpibCksY29yKGRhdGFzZXQpKQogICAgcSA8LSBsZW5ndGgodGpibCkgCiAgICBuIDwtIGRpbShkYXRhc2V0KVsxXQogICAgcHJpbnQoeF9zZXRbbnZdKQogICAgcGNvcl90ZXN0PC0gcGNvci50ZXN0KHIscSxuKQogICAKICAgIHByaW50KHBjb3JfdGVzdCkKICB9CiAgcmV0dXJuKHBjb3JfdGVzdCkKfQpwY29ydGVzdF9kZXYoYygiR2luaUNvZWZmIiwicEFkRGVnIiksYygic3VjY2Vzc2Z1bF9yYXRlIiksc2UpCgphPC0xCgoKCmExX3RlbXA9bG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckR2luaUNvZWZmKQpiMV90ZW1wPWxtKGNyb3dkZnVuZGluZyRwQWREZWd+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikKY29yLnRlc3QoYTFfdGVtcCRyZXNpZHVhbHMsYjFfdGVtcCRyZXNpZHVhbHMpCgphMl90ZW1wPWxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJHBBZERlZykKYjJfdGVtcD1sbShjcm93ZGZ1bmRpbmckR2luaUNvZWZmfmNyb3dkZnVuZGluZyRwQWREZWcpCgoKc2Vfc1sxXQpqc2JsIDwtIGMoInBBZERlZyIsInN1Y2Nlc3NmdWxfcmF0ZSIpICAgI+imgeiuoeeul+eahOebuOWFs+ezu+aVsOeahOWPmOmHj+S4i+aghwp0amJsIDwtIGMoIkdpbmlDb2VmZiIpICAj5p2h5Lu2KOaOp+WItinlj5jph4/nmoTkuIvmoIfvvIzljbPopoHmjpLpmaTlvbHlk43nmoTlj5jph4/nmoTkuIvmoIcKanNibCA8LSBjKCJHaW5pQ29lZmYiLCJzdWNjZXNzZnVsX3JhdGUiKSAgICPopoHorqHnrpfnmoTnm7jlhbPns7vmlbDnmoTlj5jph4/kuIvmoIcKdGpibCA8LSBjKCJwQWREZWciKSAgI+adoeS7tijmjqfliLYp5Y+Y6YeP55qE5LiL5qCH77yM5Y2z6KaB5o6S6Zmk5b2x5ZON55qE5Y+Y6YeP55qE5LiL5qCHCnI8LXBjb3IoYyhqc2JsLHRqYmwpLGNvcihzZSkpCgpxIDwtIGxlbmd0aCh0amJsKSAgICPorqHnrpfopoHmjqfliLbnmoTlj5jph4/mlbAKbiA8LSBkaW0oc2UpWzFdICAj6K6h566X5qC35pys6YePCgpwY29yX3Rlc3QuR2luaUNvZWZmIDwtIHBjb3IudGVzdChyLHEsbikgI+WBj+ebuOWFs+ezu+aVsOaYvuiRl+aAp+ajgOmqjOe7k+aenO+8iOi+k+WHuuW6j+WPtzPvvIkKci5HaW5pQ29lZmY9cgpwY29yX3Rlc3QuR2luaUNvZWZmCgpwY29yX3Rlc3QucEFkRGVnIDwtIHBjb3IudGVzdChyLHEsbikKci5wQWREZWc9cgpwY29yX3Rlc3QucEFkRGVnCmNvcnIudGVzdChzZSx1c2U9InBhaXJ3aXNlIikKCmBgYAoKCgpgYGB7ciByZWdyZXNzaW9uIGRpYWdub3N0aWN9CnN1bW1hcnkobG0oY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZn5jcm93ZGZ1bmRpbmckcEFkRGVnKSkKY29yLnRlc3QoY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZixjcm93ZGZ1bmRpbmckcEFkRGVnKQoKCgpzdW1tYXJ5KGxtKGxvZyhjcm93ZGZ1bmRpbmckR2luaUNvZWZmKX5sb2coY3Jvd2RmdW5kaW5nJHBBZERlZykpKQpjb3IudGVzdChsb2coY3Jvd2RmdW5kaW5nJEdpbmlDb2VmZiksbG9nKGNyb3dkZnVuZGluZyRwQWREZWcpKQoKCnFxcGxvdChsb2coY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSksbG9nKGNyb3dkZnVuZGluZyRHaW5pQ29lZmYpKQpxcXBsb3QobG9nKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUpLGxvZyhjcm93ZGZ1bmRpbmckcEFkRGVnKSkKCnJlcXVpcmUoZ3ZsbWEpCnN1bW1hcnkoZ3ZsbWEobG0obG9nKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUpfmxvZyhjcm93ZGZ1bmRpbmckcEFkRGVnKSkpKQpzdW1tYXJ5KGd2bG1hKGxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJHBBZERlZykpKQoKc3VtbWFyeShndmxtYShsbShsb2coY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSl+bG9nKGNyb3dkZnVuZGluZyRHaW5pQ29lZmYpKSkpCnN1bW1hcnkoZ3ZsbWEobG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckR2luaUNvZWZmKSkpCgpzdW1tYXJ5KGxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikpCgpwYXIobWZyb3c9YygyLDIpKQpwbG90KGxtKGxvZyhjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlKX5sb2coY3Jvd2RmdW5kaW5nJHBBZERlZykpKQpwbG90KGxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJHBBZERlZykpCnBsb3QobG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckR2luaUNvZWZmKSkKClNSMkdpbmk8LWxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZikKY29yLnRlc3QoY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZSxjcm93ZGZ1bmRpbmckR2luaUNvZWZmLG1ldGhvZCA9ICJzcGVhcm1hbiIpCnN1bW1hcnkobG0oU1IyR2luaSRyZXNpZHVhbHN+Y3Jvd2RmdW5kaW5nJHBBZERlZykpCmNvci50ZXN0KGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUsY3Jvd2RmdW5kaW5nJHBBZERlZyxtZXRob2QgPSAic3BlYXJtYW4iKQoKc3VtbWFyeShndmxtYShsbShTUjJHaW5pJHJlc2lkdWFsc35jcm93ZGZ1bmRpbmckcEFkRGVnKSkpCgpTUjJhZDwtbG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX5jcm93ZGZ1bmRpbmckcEFkRGVnKQpjb3IudGVzdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlLGNyb3dkZnVuZGluZyRwQWREZWcpCnN1bW1hcnkobG0oU1IyYWQkcmVzaWR1YWxzfmNyb3dkZnVuZGluZyRHaW5pQ29lZmYpKQpzdW1tYXJ5KGd2bG1hKGxtKFNSMmFkJHJlc2lkdWFsc35jcm93ZGZ1bmRpbmckR2luaUNvZWZmKSkpCgpzdW1tYXJ5KGd2bG1hKGxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+Y3Jvd2RmdW5kaW5nJEdpbmlDb2VmZitjcm93ZGZ1bmRpbmckcEFkRGVnKSkpCnJlcXVpcmUoY2FyKQoKI1NSMkdpbmktLS0tLS0tLS0KcXFQbG90KFNSMkdpbmksbGFiZWxzPXJvdy5uYW1lcyhjcm93ZGZ1bmRpbmcpLGlkLm1ldGhvZD0iaWRlbnRpZnkiLHNpbXVsYXRlPVRSVUUsbWFpbj0iUS1RIFBsb3QiKQoKaW5mbHVlbmNlUGxvdChTUjJHaW5pLGxhYmVscz1yb3cubmFtZXMoY3Jvd2RmdW5kaW5nKSxpZC5tZXRob2Q9ImlkZW50aWZ5IixtYWluPSJJbmZsdWVuY2UgUGxvdCIsIHN1Yj0iQ2lyY2xlIHNpemUgaWYgcHJvcG9ydGlvbmFsIHRvIENvb2sncyBkaXN0YW5jZSIpICAKCiNTUjJhbGwtLS0tLS0tLS0tCgpTUjJHaW5pQWRlZGM8LWxtKHN1Y2Nlc3NmdWxfcmF0ZX5HaW5pQ29lZmYrcEFkRGVnLGRhdGE9Y3Jvd2RmdW5kaW5nKQoKcXFQbG90KFNSMkdpbmlBZGVkYyxsYWJlbHM9cm93Lm5hbWVzKGNyb3dkZnVuZGluZyksaWQubWV0aG9kPSJpZGVudGlmeSIsc2ltdWxhdGU9VFJVRSxtYWluPSJRLVEgUGxvdCIpCmluZmx1ZW5jZVBsb3QoU1IyR2luaUFkZWRjLGxhYmVscz1yb3cubmFtZXMoY3Jvd2RmdW5kaW5nKSxpZC5tZXRob2Q9ImlkZW50aWZ5IixtYWluPSJJbmZsdWVuY2UgUGxvdCIsIHN1Yj0iQ2lyY2xlIHNpemUgaWYgcHJvcG9ydGlvbmFsIHRvIENvb2sncyBkaXN0YW5jZSIpICAKIwphbm92YShTUjJHaW5pQWRlZGMpCgpzdW1tYXJ5KGd2bG1hKGxtKHN1Y2Nlc3NmdWxfcmF0ZX5OUG92MDAwcyxkYXRhPWNyb3dkZnVuZGluZykpKQoKClNSMmdpbmllZHVjbGV2ZWw8LWxtKHN1Y2Nlc3NmdWxfcmF0ZX5wQWREZWcrUG92UmF0ZTEsZGF0YT1jcm93ZGZ1bmRpbmcpCnN1bW1hcnkoZ3ZsbWEoU1IyZ2luaWVkdWNsZXZlbCkpCmxvZ1NSMmdpbmllZHVjbGV2ZWw8LWxtKGxvZyhzdWNjZXNzZnVsX3JhdGUpfmxvZyhwQWREZWcpK2xvZyhQb3ZSYXRlMSksZGF0YT1jcm93ZGZ1bmRpbmcpCnN1bW1hcnkoZ3ZsbWEobG9nU1IyZ2luaWVkdWNsZXZlbCkpCgp0ZXN0MTwtbG0ocEFkRGVnflBvdlJhdGUxLGRhdGE9Y3Jvd2RmdW5kaW5nKQp0ZXN0MjwtbG0oUG92UmF0ZTF+cEFkRGVnLGRhdGE9Y3Jvd2RmdW5kaW5nKQoKCnBsb3QoU1IyZ2luaWVkdWNsZXZlbCkKYW5vdmEoU1IyZ2luaWVkdWNsZXZlbCkKCgoKI3Bsb3QoY3Jvd2RmdW5kaW5nJGVkdWNhdGlvbl9sZXZlcmFnZSxjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlKQojYm94cGxvdChjcm93ZGZ1bmRpbmckc3VjY2Vzc2Z1bF9yYXRlW2Nyb3dkZnVuZGluZyRlZHVjYXRpb25fbGV2ZXJhZ2U9PTFdLGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGVbY3Jvd2RmdW5kaW5nJGVkdWNhdGlvbl9sZXZlcmFnZT09Nl0pCgoKCiN2aWY6VmFyaWFuY2UgSW5mbGF0aW9uIEZhY3Rvci0tLS0tLS0tLS0KdmlmKFNSMkdpbmlBZGVkYykKdmlmKFNSMmdpbmllZHVjbGV2ZWwpCgoKc3FydCh2aWYoU1IyR2luaUFkZWRjKSk+MgpzcXJ0KHZpZihTUjJnaW5pZWR1Y2xldmVsKSk+MgojUENBLS0tLS0tLS0tCgpwcmNvbXAofnBBZERlZytQb3ZSYXRlMSxkYXRhPWNyb3dkZnVuZGluZykKCgpyZXF1aXJlKG1vbWVudHMpCmt1cnRvc2lzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUpCnNrZXduZXNzKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGUpCgpzdW1tYXJ5KGd2bG1hKGxtKGNyb3dkZnVuZGluZyRzdWNjZXNzZnVsX3JhdGV+dGVzdDEkcmVzaWR1YWxzKSkpCnN1bW1hcnkoZ3ZsbWEobG0oY3Jvd2RmdW5kaW5nJHN1Y2Nlc3NmdWxfcmF0ZX50ZXN0MiRyZXNpZHVhbHMpKSkKCmBgYAo=